最短路径3
介绍完了两个求单源最短路径的算法,现在让我们来了解多源最短路径的求法,这次是弗洛伊德-沃舍尔算法,这个算法的核心代码只有五行,非常简洁。和之前不同的是,我们这次使用临接矩阵来存储图。这个算法的特点是实现简单,但是时间复杂度相对较高,达到了O(N3),当我们对时间复杂度要求不是太高时,可以使用floyd算法快速实现求最短路。
代码实现如下:
#include <iostream> #include <cstdio> using namespace std; const int MAXN = 1001; const int MAXM = 5001; const int INF = (1 << 31) - 1; int map[MAXN][MAXN]; int n, m, x, y, v; int main() { for(int i = 1; i < MAXN; i++) { for(int j = 1; j < MAXN; j++) { map[i][j] = INF; } } scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { scanf("%d%d%d", &x, &y, &v); map[x][y] = v; } } for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { for(int k = 1; k <= n; k++) { if(map[j][k] > map[j][i] + map[i][k]) { map[j][k] = map[j][i] + map[i][k]; } } } } for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { printf("%d ", map[i][j]); } printf("\n"); } return 0; }
圆满完成。