杭电 2544 最短路径
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
- 定义数组map[i][j]元素为无穷大,当i == j时为0;
- 输入数据记录最小的map[i][j],map[i][j]为i到j的的距离
- 计算出每两个节点间的最小距离(或者始节点到每个节点的最小距离)(算法不同)
- 输出始节点到终节点距离
1 #include<cstdio> 2 #include<string.h> 3 #include<algorithm> 4 #define INF 0xfffffff 5 using namespace std; 6 int m,n,i,j,a,b,c,map[1010][1010],len[1010],flag[1010]; 7 void f1() 8 { 9 int i,j; 10 memset(flag,0,sizeof(flag)); //标记已确定最短路径的点 11 flag[1]=1; 12 for(i = 2 ; i <= n ;i++) 13 { 14 len[i]=map[1][i]; //len[i]表示节点1到节点i的距离 15 } 16 for(i = 0 ; i < n ;i++) //循环n次算出节点1到所有节点的最短距离 17 { 18 int M=INF,k=-1; 19 for(j = 1 ; j <= n ; j++) //找出与节点1最近的节点 20 { 21 if(!flag[j] && len[j] < M) 22 { 23 M=len[j]; 24 k=j; 25 } 26 } 27 if(k == -1) 28 { 29 return; 30 } 31 flag[k]=1; 32 for(j = 1 ; j <= n ;j++) //比较从节点1到各点的距离和从节点1到节点k再到各节点的距离 33 { 34 if(!flag[j] && len[j] > len[k]+map[k][j]) 35 { 36 len[j]=len[k]+map[k][j]; 37 } 38 } 39 40 } 41 } 42 void f2() //求两两点之间的距离 43 { 44 int k,i,j; 45 for(k = 1 ; k <= n ; k++) //中间点 46 { 47 for(i = 1 ; i <= n ; i++) 48 { 49 for(j = 1 ; j <= n ; j++) 50 { 51 map[i][j]=min(map[i][j],map[i][k]+map[k][j]); //比较i到j的距离与i到k再到j的距离 52 } 53 } 54 } 55 } 56 int main() 57 { 58 while(scanf("%d %d",&n,&m) && (n+m)) 59 { 60 for(i = 1 ; i <= n ; i++) 61 { 62 for(j = 1 ; j <= n ; j++) 63 { 64 map[i][j]=(i == j)?0:INF; 65 } 66 } 67 for(i = 1 ; i <= m ;i++) 68 { 69 scanf("%d %d %d",&a,&b,&c); 70 if(map[a][b] > c) 71 { 72 map[a][b]=map[b][a]=c; 73 } 74 } 75 // f1(); 76 // printf("%d\n",len[n]); 77 f2(); 78 printf("%d\n",map[1][n]); 79 } 80 }
——将来的你会感谢现在努力的自己。