Floyd 求多源最短路径原理

Floyd 求多源最短路径原理

1. 经典三层循环如下

for(int k = 1 ; k <= n ; k ++)
{
        for(int i = 1 ; i <= n ; i ++)
        {
                for(int j = 1 ; j <= n ; j ++)
                {
                        if(e[i][j] > e[i][k] + e[k][j])
                                e[i][j] = e[i][k] + e[k][j];
                 }
        }
}

2. 为什么能保证答案就是最短路径

首先i 到 j 的最短路径有两种情况:直接和间接。
要么 e[i][j] 身就是两者最短路径,要么通过其他点中转。
Floyd 三层循环本质就是枚举 1-n 所有点作为中间站来松弛。
对于求 i 和 j 的最短路径,松弛了1,2,3 顶点才得到,可以看到只要松弛了这三个顶点,就能得出最小路径,而与松弛的顺序没有关系。
所以要求任意 i 到 j 之间的最短路径,只需松弛所有结点即可。
图示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值