图论 Floyd算法

本文介绍Floyd算法,一种用于计算图中所有顶点对之间最短路径的经典算法。该算法的时间复杂度为O(n^3),空间复杂度为O(n^2)。文章详细解释了算法的工作原理、实现步骤,并提供了核心代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值