最短路 |
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 180 Accepted Submission(s): 100 |
|
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
|
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商
店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1&
lt;=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。 |
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间 |
Sample Input
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0 |
Sample Output
3 2 |
最短路:裸的最短路,没有用spfa(不稳定),用的dijkstra的一种加堆方式,复杂度是Elog(E)的,但复杂度说不清楚那个Log(E),网上有篇文章专门做了分析的
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 24 void addedge(int x,int y,int z) 25 { 26 cnt++; 27 e[cnt].n=x; 28 e[cnt].to=y; 29 e[cnt].z=z; 30 e[cnt].ne=h[x]; 31 h[x]=cnt; 32 } 33 34 void close() 35 { 36 exit(0); 37 } 38 39 void dijkstra() 40 { 41 memset(f,false,sizeof(f)); 42 while (!q.empty()) 43 q.pop(); 44 f[1]=true; 45 for (int i=1;i<=n;i++) 46 d[i]=INF; 47 d[1]=0; 48 for (int p=h[1];p!=-1;p=e[p].ne) 49 { 50 s.n=1; 51 s.to=e[p].to; 52 s.z=e[p].z; 53 q.push(s); 54 } 55 while (!q.empty()) 56 { 57 s=q.top(); 58 q.pop(); 59 to=s.to; 60 if (f[to]) continue; 61 d[to]=s.z; 62 f[to]=true; 63 for (int p=h[to];p!=-1;p=e[p].ne) 64 { 65 node=e[p].to; 66 if (not f[node]) 67 { 68 ya.n=to; 69 ya.to=node; 70 ya.z=d[to]+e[p].z; 71 q.push(ya); 72 } 73 } 74 } 75 } 76 77 void init() 78 { 79 while (scanf("%d %d",&n,&m)!=EOF) 80 { 81 memset(h,-1,sizeof(h)); 82 cnt=0; 83 if (n==0 && m==0) break; 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 dijkstra(); 91 printf("%d\n",d[n]); 92 } 93 } 94 95 96 int main () 97 { 98 init(); 99 close(); 100 }