弗洛伊德算法(Floyd-Warshall)
问题描述:
上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题也被称为“多源最短路径”问题。
构建邻接矩阵
直观思维解决问题
继续加入第3个点,第4个点。。。。。。。
#include <bits/stdc++.h>
using namespace std;
int inf = 999999;
int e[4][4] = {{0, 2, 6, 4}, {inf, 0, 3, inf}, {7, inf, 0, 1}, {5, inf, 12, 0}};
int main() {
for (int v = 0; v < 4; v++)
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
if (e[i][j] > e[i][v] + e[v][j])
e[i][j] = e[i][v] + e[v][j];
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
cout << e[i][j] << " ";
}
cout << endl;
}
return 0;
}
注意事项:
(1) Floyd算法可以解决带有负权边的图,但不能判断是否带有“负权回路”的图(带有负权回路的图是没有最短路径的)
(2) Floyd算法的时间复杂度为O(n^3),主要解决多源最短路径问题(任意两点之间的最短路径)。