Floyd算法,思想为数学归纳法,关键伪代码:

if (dist[i][k] + dist[k][j] < dist[i][j])
  dist[i][j] = dist[i][k] + dist[k][j];

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 #define MAX_N 105
 6 #define INFINITE 10000
 7 
 8 int Nv, Me;
 9 int minMap[MAX_N][MAX_N];
10 
11 void Floyd()
12 {
13     for (int k = 1; k <= Nv; ++k)
14         for (int i = 1; i <= Nv; ++i)
15             for (int j = 1; j <= Nv; ++j)
16                 minMap[i][j] = min(minMap[i][j], minMap[i][k] + minMap[k][j]);
17 }
18 
19 int main()
20 {
21     scanf("%d%d", &Nv, &Me);
22     for (int i = 1; i <= Nv; ++i)
23         for (int j = 1; j <= Nv; ++j)
24             if (i == j) minMap[i][j] = 0;
25             else minMap[i][j] = INFINITE;
26 
27     int u, v, len;
28     while (Me--) {
29         scanf("%d%d%d", &u, &v, &len);
30         if (len < minMap[u][v])
31             minMap[u][v] = minMap[v][u] = len;
32     }
33 
34     Floyd();
35 
36     for (int i = 1; i <= Nv; ++i) {
37         for (int j = 1; j <= Nv; ++j)
38             printf("%d ", minMap[i][j]);
39         printf("\n");
40     }
41 
42     return 0;
43 }
View Code