HDOJ 2544
最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 24454 Accepted Submission(s): 10531
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
floyed 算法:
1 #include <stdio.h> 2 #include<string.h> 3 int g[101][101]; 4 #define inf 0xfffff; 5 void floyed(int n) 6 { 7 int i,j,k; 8 for(k=1;k<=n;k++) 9 { 10 for(i=1;i<=n;i++) 11 { 12 for(j=1;j<=n;j++) 13 { 14 if(g[i][k]+g[k][j]<g[i][j]) 15 g[i][j]=g[i][k]+g[k][j]; 16 } 17 } 18 } 19 } 20 int main() 21 { 22 int n,m,a,b,x,i,j; 23 while(scanf("%d %d",&n,&m)!=EOF) 24 { 25 if(!n&&!m)break; 26 for(i=1;i<=n;i++) 27 { 28 for(j=1;j<=n;j++) 29 { 30 if(i==j) 31 g[i][j]=0; 32 else 33 g[i][j]=inf; 34 } 35 } 36 for(i=1;i<=m;i++) 37 { 38 scanf("%d %d %d",&a,&b,&x); 39 if(g[a][b]>x) 40 g[a][b]=g[b][a]=x; 41 } 42 //prim(n); 43 floyed(n); 44 printf("%d\n",g[1][n]); 45 } 46 return 0; 47 }
dijkstra最简单算法运用:
1 #include <stdio.h> 2 #include<string.h> 3 int g[101][101]; 4 #define inf 0xfffff; 5 void prim(int n) 6 { 7 int lowcost[101],used[101],i,j,k; 8 memset(used,0,sizeof(used)); 9 memset(lowcost,0,sizeof(lowcost)); 10 for(i=1;i<=n;i++) 11 lowcost[i]=g[i][1]; 12 used[1]=1; 13 for(i=1;i<n;i++) 14 { 15 int min=inf; 16 j=1; 17 for(k=2;k<=n;k++) 18 if(lowcost[k]<min&&!used[k]) 19 min=lowcost[k],j=k; 20 used[j]=1; 21 for(k=2;k<=n;k++) 22 { 23 if(lowcost[j]+g[k][j]<lowcost[k]&&!used[k]) 24 lowcost[k]=lowcost[j]+g[k][j], 25 g[k][1]=g[1][k]=lowcost[k]; 26 } 27 } 28 29 } 30 int main() 31 { 32 int n,m,a,b,x,i,j; 33 while(scanf("%d %d",&n,&m)!=EOF) 34 { 35 if(!n&&!m)break; 36 for(i=1;i<=n;i++) 37 { 38 for(j=1;j<=n;j++) 39 { 40 if(i==j) 41 g[i][j]=0; 42 else 43 g[i][j]=inf; 44 } 45 } 46 for(i=1;i<=m;i++) 47 { 48 scanf("%d %d %d",&a,&b,&x); 49 if(g[a][b]>x) 50 g[a][b]=g[b][a]=x; 51 } 52 prim(n); 53 printf("%d\n",g[1][n]); 54 } 55 return 0; 56 }