畅通工程续

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 42 Accepted Submission(s): 25

Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
 

Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
 

Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
 

Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
 

Sample Output
2
-1

思路:水题大放送!最短路不管它了

  1 #include <cstdio>
  2 #include <cstring>   
  3 #include <iostream>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <cstdlib>
  7 #include <queue>
  8 using namespace std;
  9 
 10 const int maxn=110,maxm=20010,INF=10000000;
 11 struct qq
 12 {
 13     int n,to,z,ne;
 14     friend bool operator < (qq a,qq b)
 15     {
 16         return a.z>b.z;
 17     }
 18 } e[maxm],s,ya;
 19 
 20 priority_queue<qq> q;
 21 int d[maxn],node,x,y,z,cnt,to,n,m,h[maxn];
 22 bool f[maxn];
 23 int st[maxn],pp[maxn],ans;
 24 
 25 void addedge(int x,int y,int z)
 26 {
 27     cnt++;
 28     e[cnt].n=x;
 29     e[cnt].to=y;
 30     e[cnt].z=z;
 31     e[cnt].ne=h[x];
 32     h[x]=cnt;
 33 }
 34 
 35 void close()
 36 {
 37     exit(0);
 38 }
 39 
 40 void dijkstra(int st)
 41 {
 42     memset(f,false,sizeof(f));
 43     while (!q.empty())
 44         q.pop();
 45     f[st]=true;
 46     for (int i=0;i<=n;i++)
 47         d[i]=INF;
 48     d[st]=0;
 49     for (int p=h[st];p!=-1;p=e[p].ne)
 50     {
 51         s.n=st;
 52         s.to=e[p].to;
 53         s.z=e[p].z;
 54         q.push(s);
 55     }
 56     while (!q.empty())
 57     {
 58         s=q.top();
 59         q.pop();
 60         to=s.to;
 61         if (f[to]) continue;
 62         d[to]=s.z;
 63         f[to]=true;
 64         for (int p=h[to];p!=-1;p=e[p].ne)
 65         {
 66             node=e[p].to;
 67             if (not f[node])
 68             {
 69                 ya.n=to;
 70                 ya.to=node;
 71                 ya.z=d[to]+e[p].z;
 72                 q.push(ya);
 73             }
 74         }
 75     }
 76 }
 77 
 78 void init()
 79 {
 80     while (scanf("%d %d",&n,&m)!=EOF)
 81     {
 82         memset(h,-1,sizeof(h));
 83         cnt=0;
 84         for (int i=1;i<=m;i++)
 85         {
 86             scanf("%d %d %d",&x,&y,&z);
 87             addedge(x,y,z);
 88             addedge(y,x,z);
 89         }
 90         int st,en;
 91         scanf("%d %d",&st,&en);
 92         dijkstra(st);
 93         if (d[en]!=INF)
 94             printf("%d\n",d[en]);
 95         else
 96             printf("-1\n");
 97     }
 98 }
 99 
100 
101 int main ()
102 {
103     init();
104     close();
105 }

 

posted on 2013-04-26 22:44  cssystem  阅读(144)  评论(0编辑  收藏  举报