杭电 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条商店到赛场的路线。
 

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
 
  1. 定义数组map[i][j]元素为无穷大,当i == j时为0;
  2. 输入数据记录最小的map[i][j],map[i][j]为i到j的的距离
  3. 计算出每两个节点间的最小距离(或者始节点到每个节点的最小距离)(算法不同)
  4. 输出始节点到终节点距离
 
 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
",len[n]);
77         f2();
78         printf("%d
",map[1][n]);
79     }
80 }
——将来的你会感谢现在努力的自己。
原文地址:https://www.cnblogs.com/yexiaozi/p/5736723.html