最短路 Floyd()

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = ???;
 5 const int INF = 0x3f3f3f3f;
 6 int n, m;
 7 int a, b, x;
 8 int dis[N][N];
 9 
10 void Floyd(){
11     for(int k=0; k<n; k++)
12         for(int i=0; i<n; i++)
13              for(int j=0; j<n; j++)
14              //选择从i到j的最短路 ( 比较当前知道的i到j的最短距离 与 从i到k再到j的距离) 
15                  dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
16 }
17 
18 int main()
19 {
20     while(scanf("%d %d",&n,&m)!=EOF){
21         //初始化 
22         for(int i=0; i<n; i++){
23             for(int j=0; j<n; j++)
24                 dis[i][j] = INF;
25             dis[i][j] = 0;
26         }
27         //输入两点距离 
28         for(int i=0; i<m; i++){
29             scanf("%d %d %d", &a, &b, &x);
30             x = min(dis[a][b], x);    
31             dis[a][b] = dis[b][a] = x;
32         }
33         // 
34         Floyd();
35         // 
36         int S,T;
37         scanf("%d %d",&S,&T);
38         if(dis[S][T]==INF)    printf("-1\n");
39         else                printf("%d\n",dis[S][T]);
40     }
41     
42 }

猜你喜欢

转载自www.cnblogs.com/0424lrn/p/12237605.html