HDU2544--最短路
最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21480 Accepted Submission(s): 9168
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条商店到赛场的路线。
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
UESTC 6th Programming Contest Online
Recommend
lcy
此题被称为神级试用模板题,四种方法都可以。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 8 #define INF 9999999 9 int edge[101][101]; 10 int dis[101]; 11 int vis[101]; 12 int n,m; 13 14 int dijkstra(int u0) 15 { 16 int i,j,k; 17 for(i=1;i<=n;i++) 18 { 19 dis[i]=edge[u0][i]; 20 vis[i]=0; 21 } 22 vis[u0]=1; 23 dis[u0]=0; 24 for(i=1;i<n;i++) 25 { 26 int mmin=INF,v=-1; 27 for(j=1;j<=n;j++) 28 { 29 if(vis[j]!=1&&dis[j]<mmin) 30 { 31 v=j; 32 mmin=dis[j]; 33 } 34 } 35 if(v!=-1) 36 { 37 vis[v]=1; 38 for(k=1;k<=n;k++) 39 { 40 if(edge[v][k]!=INF&&dis[v]+edge[v][k]<dis[k]) 41 { 42 dis[k]=dis[v]+edge[v][k]; 43 } 44 } 45 } 46 } 47 return dis[n]; 48 } 49 50 51 int main() 52 { 53 while(scanf("%d%d",&n,&m)!=EOF) 54 { 55 if(!n&&!m)break; 56 memset(edge,0,sizeof(edge)); 57 int i,j; 58 for(i=1;i<=n;i++) 59 { 60 for(j=1;j<=n;j++) 61 { 62 if(i==j)edge[i][j]=0; 63 else if(edge[i][j]==0)edge[i][j]=INF; 64 } 65 } 66 for(i=1;i<=m;i++) 67 { 68 int u,v,w; 69 scanf("%d%d%d",&u,&v,&w); 70 if(w<edge[u][v]) 71 { 72 edge[u][v]=edge[v][u]=w; 73 } 74 } 75 int u0=1; 76 int ans=dijkstra(u0); 77 printf("%d\n",ans); 78 } 79 return 0; 80 }