最短路径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;
}

 

 

 

  圆满完成。

posted @ 2018-08-11 23:02  potato226  阅读(119)  评论(0编辑  收藏  举报