图论 Floyd算法

Floyd算法  

  时间复杂度O (n^3)

  空间复杂度O (n^2)

用处

  可以求任意两个点之间的最短路径长度。

  得出的邻接矩阵存储 i 到 j 的最短路径长度。 

  无法解决“负权环问题” 

  1  ____ -2

     /

    3

思路(摘自知乎作者-赵轩昂)

采用动态规划思想,f[k][i][j]表示ij之间可以通过编号不超过k(1...k)的节点的最短路径。

初值f[0][i][j]为原图的邻接矩阵。

f[k][i][j]可以从f[k-1][i][j]转移来,表示ij不经过k这个节点。
也可以从f[k-1][i][k]+f[k-1][k][j]转移过来,表示经过k这个点。
意思即f[k][i][j] = min(f[k-1][i][j] , f[k-1][i][k]+f[k-1][k][j])

然后你就会发现f最外层一维空间可以省略,因为f[k]只与f[k-1]有关。

初始化

  用邻接矩阵表示,

  f[i][j]初始化为 i 到 j 的距离,

  如果 i 无法到达 j 则 f[i][j] = INF;

//初始化 
for(int i=0;i<N;++i){
    for(int j=0;j<N;++j){
        if(i==j)
            f[i][j] = 0;
        else
            f[i][j] = INF;
    }
}
//读入边
for(int i=1;i<=m;i++){
    cin >> t1 >> t2 >> t3;
    f[t1][t2] = t3;
} 

核心代码:

for(int k=0;k<n;++k){
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            f[i][j] = min(f[i][j],f[i][k] + f[j][k]);
        }
    }
}

  

原文地址:https://www.cnblogs.com/--zz/p/10623044.html