Floyd算法(求所有节点对的最短路径)

Floyd算法(求所有节点对的最短路径):

首先考虑使用单源最短路径算法重复|V|次,这样的复杂度会达到|V|^4,因为其中有很多重复的运算。

Floyd算法复杂度为|V|^3。

其维护一个二维数组Q,Q[i][j]表示i到j的最短路径长度,如果不存在则为无穷大,若i==j则为0。

然后分别利用节点0、1、2、...n-1(n=|V|)来松弛所有边。

比如最初使用节点0来松弛,即对于所有的i!=j,考察是否满足Q[i][j]>Q[i][0]+Q[0][j],如果成立,那么就更新Q[i][j]的值为Q[i][0]+Q[0][j]。

接下来使用节点1继续上述操作。

。。。

每个节点循环一次,每次循环中要遍历二维数组Q中的所有节点,所以总复杂度为O(|V|^3)。

代码:

vector<vector<int>> Floyd(vector<vector<int>>& matrix){    //输入为邻接矩阵
    int n=matrix.size();
    if(n==0 or n!=matrix[0].size()){
        return;
    }
    //初始化二维数组Q
    vector<vector<int>> Q(n,vector<int>(n,10000));
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            if(matrix[i][j]){
                Q[i][j]=matrix[i][j];
            }
        }
    }
    for(int i=0;i<n;++i){
        Q[i][i]=0;
    }
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            for(int k=0;k<n;++k){
                Q[j][k]=min(Q[j][k],Q[j][i]+Q[i][k]);
            }
        }
    }
    return move(Q);
}

 

posted @ 2020-06-05 15:27  NeoZy  阅读(1114)  评论(0编辑  收藏  举报