最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14129 Accepted Submission(s): 6037
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
输入保证至少存在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
Source
Recommend
lcy
code:
1 #include <iostream> 2 #include <iomanip> 3 #include <fstream> 4 #include <sstream> 5 #include <algorithm> 6 #include <string> 7 #include <set> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <list> 12 #include <vector> 13 #include <cstdio> 14 #include <cstdlib> 15 #include <cstring> 16 #include <cmath> 17 #include <ctime> 18 #include <ctype.h> 19 using namespace std; 20 21 #define MAXN 101 22 23 int n,m; 24 int map[MAXN][MAXN]; 25 int vst[MAXN]; 26 int dis[MAXN]; 27 int s; 28 29 void Dijkstra() 30 { 31 int i,j; 32 int s=1; 33 memset(vst,0,sizeof(vst)); 34 for(i=1;i<=n;i++) 35 dis[i]=map[s][i]; 36 vst[s]=1; 37 dis[s]=0; 38 for(i=2;i<=n;i++) 39 { 40 int mindis=INT_MAX; 41 int nextgoal; 42 for(j=2;j<=n;j++) 43 if(!vst[j]&&dis[j]<mindis) 44 { 45 mindis=dis[j]; 46 nextgoal=j; 47 } 48 vst[nextgoal]=1; 49 for(j=2;j<=n;j++) 50 if(!vst[j]&&map[nextgoal][j]<INT_MAX) 51 { 52 int updatedis=map[nextgoal][j]+dis[nextgoal]; 53 if(dis[j]>updatedis) 54 dis[j]=updatedis; 55 } 56 } 57 } 58 59 int main() 60 { 61 int i,j; 62 int a,b,times; 63 while(~scanf("%d%d",&n,&m),n,m) 64 { 65 for(i=1;i<=n;i++) 66 for(j=1;j<=n;j++) 67 { 68 if(i==j) 69 map[i][j]=0; 70 else 71 map[i][j]=INT_MAX; 72 } 73 for(i=1;i<=m;i++) 74 { 75 scanf("%d%d%d",&a,&b,×); 76 map[a][b]=map[b][a]=times; 77 } 78 Dijkstra(); 79 printf("%d\n",dis[n]); 80 } 81 return 0; 82 }