HDU 1874 畅通工程续 (Dijkstra)

畅通工程续

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

 

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
 

 
Analysis
  求图最短路,当然用Dijkstra
 
Tips
  • 一个城市到另一个城市可以有多条路,但是要选最短的那一条
  1 #include <stdio.h>
  2 #include <string.h>
  3 #define INF 12000
  4 
  5 int map[205][205];
  6 
  7 int dist[205];
  8 bool s[205];
  9 int prev[205];
 10 int flag;
 11 
 12 
 13 void dijkstra(int n,int v)
 14 {
 15     int i,j;
 16 
 17     for(i=0;i<n;i++)
 18     {
 19         dist[i] = map[v][i];
 20         s[i] = 0;
 21         if(dist[i] >= INF) prev[i] = 0;
 22         else prev[i] = v;
 23     }
 24 
 25     //begin
 26     s[v] = 1;
 27     dist[v] = 0;
 28 
 29     for(i=0;i<n;i++)
 30     {
 31         int tmp = INF;
 32         int u = v;
 33         for(j=0;j<n;j++)
 34         {
 35             if(!s[j] && (dist[j]<tmp))
 36             {
 37                 u = j;
 38                 tmp = dist[j];
 39             }
 40         }
 41 
 42         if(tmp >= INF)
 43             break;
 44 
 45         s[u] = 1;
 46 
 47         for(j=0;j<n;j++)
 48         {
 49             if((!s[j]) && map[u][j] < INF )
 50             {
 51                 int newdist = dist[u] + map[u][j];
 52                 if(newdist < dist[j])
 53                 {
 54                     dist[j] = newdist;
 55                     prev[j] = u;
 56                 }
 57             }
 58         }
 59     }
 60 }
 61 
 62 int main()
 63 {
 64     int m,i,j,s,A,B,X,n,t;
 65 
 66     while(~scanf("%d%d",&n,&m))
 67     {
 68         flag = 0;
 69 
 70         for(i=0;i<n;i++)
 71             for(j=0;j<n;j++)
 72             map[i][j] = INF;
 73 
 74         for(i=0;i<n;i++)
 75             map[i][i] = 0;
 76 
 77         for(i=0;i<m;i++)
 78         {
 79             scanf("%d%d%d",&A,&B,&X);
 80             if(map[A][B] > X)
 81             {
 82                 map[A][B] = X;
 83                 map[B][A] = X;
 84             }
 85         }
 86         scanf("%d%d",&s,&t);
 87 /*
 88         //验证建图正确性
 89         printf("
map:
");
 90         for(i=0;i<n;i++)
 91         {
 92             for(j=0;j<n;j++)
 93             printf("%d ",map[i][j]);
 94             printf("
");
 95         }
 96         printf("
");
 97 */
 98         dijkstra(n,s);
 99 
100         if(dist[t] == INF) printf("-1
");
101         else printf("%d
",dist[t]);
102     }
103     return 0;
104 }
原文地址:https://www.cnblogs.com/GY8023/p/4682196.html