杭电 1874 畅通工程续 (求某节点到某节点的最短路径)

Description

某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。 

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

Input

本题目包含多组数据,请处理到文件结束。 
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。 
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。 
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。

Output

对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1. 

Sample Input

3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2

Sample Output

2
-1

最短路径模板
  1. 定义数组map[i][j]元素为无穷大,当i == j时为0;
  2. 输入数据记录最小的map[i][j],map[i][j]为i到j的的距离
  3. 计算出每两个节点间的最小距离(或者始节点到每个节点的最小距离)(算法不同)
  4. 输出始节点到终节点距离
 
 1 #include<cstdio>
 2 #define INF 0xfffffff
 3 #include<string.h>
 4 using namespace std;
 5 int m,n,a,b,c,flag[20000],map[20000][20000],len[20000],begin,end;
 6 void f1()
 7 {
 8     int i,j;
 9     memset(flag,0,sizeof(flag));            //标记已确定从begin出最短路径的节点 
10     for(i = 0 ; i < n ; i++)
11     {
12         len[i]=map[begin][i];                //len[i]表示节点begin到节点i的距离 
13     }
14     flag[begin]=1;
15     for(i = 0 ; i < n ;i++)                    //循环n次算出节点begin到所有节点的最短距离
16     {
17         int min=INF,k=-1;
18         for(j = 0 ; j < n ; j++)            //找出与节点begin最近的节点 
19         {
20             if(!flag[j] && min > len[j])
21             {
22                 min=len[j];
23                 k=j;
24             }
25         }
26         if(k == -1)
27         {
28             return;
29         }
30         flag[k]=1;
31         for(j = 0 ; j < n ; j++)            //比较从节点begin到各点的距离和从节点begin到节点k再到各节点的距离
32         {
33             if(!flag[j] && len[j] > len[k]+map[k][j])
34             {
35                 len[j]=len[k]+map[k][j];
36             }
37         }
38     }
39 }
40 int main()
41 {
42     int i,j;
43     while(scanf("%d %d",&n,&m)!=EOF)
44     {
45         for(i = 0 ; i < n ; i++)
46         {
47             for(j = 0 ; j < n ; j++)
48             {
49                 map[i][j]=(i == j)?0:INF;
50             }
51         }
52         for(i = 0 ; i < m ; i++)
53         {
54             scanf("%d %d %d",&a,&b,&c);
55             if(map[a][b] > c)
56             {
57                 map[a][b]=map[b][a]=c;
58             }
59         }
60         scanf("%d %d",&begin,&end);
61         f1();
62         if(len[end] < INF)                        //若存在路径则路径小于“无穷大” 
63         printf("%d
",len[end]);
64         else
65         printf("-1
");
66     }
67     
68  } 
——将来的你会感谢现在努力的自己。
原文地址:https://www.cnblogs.com/yexiaozi/p/5737082.html