最短路 Edit
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt
。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。
每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤10000 ),NN 表示成都的大街上有几个路口,标号为11 的路口是商店所在地,标号为NN 的路口是赛场所在地,MM 则表示在成都有几条路。N=M=0N=M=0 表示输入结束。
接下来MM 行,每行包括33 个整数AA ,BB ,CC (1≤A1≤A ,B≤NB≤N ,1≤C≤10001≤C≤1000 ),表示在路口AA 与路口BB 之间有一条路,我们的工作人员需要CC 分钟的时间走过这条路。
输入保证至少存在11 条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间。
Sample input and output
Sample Input | Sample Output |
---|---|
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0 |
3 2 |
Hint
Source
电子科技大学第六届ACM程序设计大赛 初赛
题意: 中文题意
题解:再来一遍SPFA 当队头节点now出队时 需要 used[now]=0;
1 #include<bits/stdc++.h> 2 #define ll __int64 3 #define mod 1e9+7 4 #define PI acos(-1.0) 5 #define bug(x) printf("%%%%%%%%%%%%%",x); 6 #define inf 1e8 7 using namespace std; 8 int pre[105]; 9 int dis[105]; 10 int n,m; 11 int s,t,d; 12 int used[105]; 13 int now,zha; 14 int nedge=0; 15 struct node 16 { 17 int pre; 18 int to; 19 int w; 20 }N[20005]; 21 void add(int aa,int bb,int cc) 22 { 23 nedge++; 24 N[nedge].to=bb; 25 N[nedge].w=cc; 26 N[nedge].pre=pre[aa]; 27 pre[aa]=nedge; 28 } 29 queue<int>q; 30 void spfa() 31 { 32 for(int i=1;i<=n;i++) 33 { 34 dis[i]=inf; 35 used[i]=0; 36 } 37 dis[1]=0; 38 q.push(1); 39 used[1]=1; 40 while(!q.empty()) 41 { 42 now=q.front(); 43 q.pop(); 44 used[now]=0; 45 for(int i=pre[now];i;i=N[i].pre) 46 { 47 if(dis[now]+N[i].w<dis[N[i].to]) 48 { 49 dis[N[i].to]=dis[now]+N[i].w; 50 if(!used[N[i].to]) 51 { 52 used[N[i].to]=1; 53 q.push(N[i].to); 54 } 55 } 56 } 57 } 58 } 59 int main() 60 { 61 while(scanf("%d %d",&n,&m)&&n&&m) 62 { 63 nedge=0; 64 memset(N,0,sizeof(N)); 65 memset(pre,0,sizeof(pre)); 66 memset(dis,0,sizeof(dis)); 67 for(int i=1;i<=m;i++) 68 { 69 scanf("%d %d %d",&s,&t,&d); 70 add(s,t,d); 71 add(t,s,d); 72 } 73 spfa(); 74 printf("%d ",dis[n]); 75 } 76 return 0; 77 }