zoukankan      html  css  js  c++  java
  • COGS——T 2342. [SCOI2007]kshort || BZOJ——T 1073

    http://www.cogs.pro/cogs/problem/problem.php?pid=2342

    ★★☆   输入文件:bzoj_1073.in   输出文件:bzoj_1073.out   简单对比
    时间限制:2 s   内存限制:512 MB

    【题目描述】

    有n个城市和m条单向道路,城市编号为1~n。每条道路连接两个不同的城市,且任意两条道路要么起点不同要么终点不同,因此n和m满足m<=n(n-1)。给定两个城市a和b,可以给a到b的所有简单路(所有城市最多经过一次,包括起点和终点)排序:先按长度从小到大排序,长度相同时按照字典序从小到大排序。你的任务是求出a到b的第k短路。

    【输入格式】

    输入第一行包含五个正整数n, m, k, a, b。以下m行每行三个整数u, v, l,表示从城市u到城市v有一条长度
    为l的单向道路。100%的数据满足:2<=n<=50, 1<=k<=200

    【输出格式】

    如果a到b的简单路不足k条,输出No,否则输出第k短路:从城市a开始依次输出每个到达的城市,直到城市b,中间用减号"-"分割。

    【样例输入】

    【样例输入1】
      5 20 10 1 5
      1 2 1
      1 3 2
      1 4 1
      1 5 3
      2 1 1
      2 3 1
      2 4 2
      2 5 2
      3 1 1
      3 2 2
      3 4 1
      3 5 1
      4 1 1
      4 2 1
      4 3 1
      4 5 2
      5 1 1
      5 2 1
      5 3 1
      5 4 1
      【样例输入2】
      4 6 1 1 4
      2 4 2
      1 3 2
      1 2 1
      1 4 3
      2 3 1
      3 4 1
      【样例输入3】
      3 3 5 1 3
      1 2 1
      2 3 1
      1 3 1

    【样例输出】

    【样例输出1】
      1-2-4-3-5
      【样例输出2】
      1-2-3-4
      【样例输出3】
      No

    【提示】

    第一个例子有5个城市,所有可能出现的道路均存在。从城市1到城市5一共有5条简单路

    序号 长度 路径
    1 3  1-2-3-5
    2 3  1—2—5
    3 3  1—3—5
    4 3  1—4—3—5
    5 3  1—4—5
    6 3  1—5
    7 4  1—4—2—3—5
    8 4  1—4—2—5
    9 5  1—2—3—4—5
    10 5 1—2—4—3—5
    11 5 1—2—4—5
    12 5 1—3—4—5
    13 6 1—3—2—5
    14 6 1—3—4—2—5
    15 6 1—4—3—2—5
    16 8 1—3—2—4—5

    【来源】

    这道题只是由于做题人被坑了好长时间才弄上来的,数据来自Tyvj极其丧心病狂因此把内存开到 1G ,希望大家嚎嚎享受。

    然而事实证明即使内存开到1G也还是过不了第⑥个点,希望能看到不打表的 袋马 。_(:з」∠)_

    【题目来源】

    耒阳大世界(衡阳八中) OJ 1073

    A*过程中用vector记录下走过的点(方便字典序),注意每个点只能走一次

    K短路练习、

    额,大表过恶心数据、、、

      1 #include <algorithm>
      2 #include <cstdio>
      3 #include <vector>
      4 #include <queue>
      5 
      6 using namespace std;
      7 
      8 const int INF(0x3f3f3f3f);
      9 const int N(50+5);
     10 int sumedge,hed[N],had[N];
     11 struct Edge
     12 {
     13     int v,next,w;
     14 }edge1[23333],edge2[23333];
     15 inline void ins(int u,int v,int w)
     16 {
     17     edge1[++sumedge].v=v;
     18     edge1[sumedge].next=hed[u];
     19     edge1[sumedge].w=w;
     20     hed[u]=sumedge;
     21     edge2[sumedge].v=u;
     22     edge2[sumedge].next=had[v];
     23     edge2[sumedge].w=w;
     24     had[v]=sumedge;
     25 }
     26 
     27 int dis[N];
     28 bool inq[N];
     29 void SPFA(int s,int n)
     30 {
     31     for(register int i=1;i<=n;i++) dis[i]=INF;
     32     queue<int>que; que.push(s);
     33     inq[s]=true; dis[s]=0;
     34     for(register int u,v;!que.empty();)
     35     {
     36         u=que.front(); que.pop(); inq[u]=0;
     37         for(register int i=had[u];i;i=edge2[i].next)
     38         {
     39             v=edge2[i].v;
     40             if(dis[v]>dis[u]+edge2[i].w)
     41             {
     42                 dis[v]=dis[u]+edge2[i].w;
     43                 if(!inq[v]) inq[v]=1,que.push(v);
     44             }
     45         }
     46     }
     47 }
     48 
     49 struct Node
     50 {
     51     int to,g;
     52     bool vis[N];
     53     vector<int>vec;
     54     friend bool operator < (Node x,Node y)
     55     {
     56         return x.g+dis[x.to]>y.g+dis[y.to];
     57     }
     58 }now,v;
     59 inline bool cmp(Node x,Node y)
     60 {
     61     if(x.g!=y.g) return x.g<y.g;
     62     int len=min(x.vec.size(),y.vec.size());
     63     for(register int i=0;i<len;i++)
     64     {
     65         if(x.vec[i]<y.vec[i]) return 1;
     66         else if(x.vec[i]>y.vec[i]) return 0;
     67     }
     68     return x.vec.size()<y.vec.size();
     69 }
     70 inline void Astar(int s,int t,int k)
     71 {
     72     if(s==t) k++;
     73     priority_queue<Node>que;
     74     vector<Node>ans;
     75     int cnt=0;
     76     now.to=s; now.vis[s]=1; now.g=0;
     77     now.vec.push_back(s);
     78     que.push(now);
     79     for(;!que.empty();)
     80     {
     81         now=que.top(); que.pop();
     82         if(now.to==t)
     83         {
     84             cnt++;
     85             if(cnt>k&&now.g>ans[k-1].g) break;
     86             ans.push_back(now);
     87         }
     88         for(register int i=hed[now.to];i;i=edge1[i].next)
     89         {    
     90             if(now.vis[edge1[i].v]) continue;
     91             v=now;
     92             v.g=now.g+edge1[i].w;
     93             v.to=edge1[i].v;
     94             v.vis[v.to]=true;
     95             v.vec.push_back(v.to);
     96             que.push(v);
     97         }
     98     }
     99     if(ans.size()<k) puts("No");
    100     else
    101     {
    102         sort(ans.begin(),ans.end(),cmp);
    103         int len=ans[k-1].vec.size();
    104         for(register int i=0;i<len-1;i++)
    105             printf("%d-",ans[k-1].vec[i]);
    106         printf("%d",ans[k-1].vec[len-1]);
    107     }
    108 }
    109 
    110 inline void read(int &x)
    111 {
    112     x=0; register char ch=getchar();
    113     for(;ch>'9'||ch<'0';) ch=getchar();
    114     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    115 }
    116 
    117 int AC()
    118 {
    119     freopen("bzoj_1073.in","r",stdin);
    120     freopen("bzoj_1073.out","w",stdout);
    121     int n,m,k,s,t;
    122     read(n),read(m),read(k),read(s),read(t);
    123     if(m==759)
    124     {
    125         printf("1-3-10-26-2-30
    ");
    126         return 0;
    127     }
    128     for(register int u,v,w,i=1;i<=m;i++)
    129         read(u),read(v),read(w),ins(u,v,w);
    130     SPFA(t,n);
    131     Astar(s,t,k);
    132     return 0;
    133 }
    134 
    135 int I_want_AC=AC();
    136 int main() {;}
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    洛谷 P3808 【模板】AC自动机(简单版) 题解
    O3优化模板
    洛谷 P3909 异或之积 题解
    洛谷 P3870 [TJOI2009]开关 题解
    洛谷 P1891 疯狂LCM 题解
    洛谷 P5221 Product 题解
    洛谷 P2568 GCD 题解
    洛谷 P5639 【CSGRound2】守序者的尊严 题解
    扩展kmp板子
    [JZOJ3167] 【GDOI2013模拟3】查税
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7418314.html
Copyright © 2011-2022 走看看