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); }
进击的小🐴农