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 }
浙公网安备 33010602011771号