Floyed-Warshall 弗洛伊德算法 之k的位置

弗洛伊德算法是图论中求得最短路径的一种O(N三次方)的一种算法。
它的中心思想是将每一个中转点枚举,从而求得最短路径。代码就不写了。
最近在看弗洛伊德算法是,发现其中有一条重要的规矩,就是要把有关中转点k的枚举的for循环放在最外层,这是问什么呢??本蒟蒻上网搜,问大佬,都没有得到想要的答案,后来灵光乍现,突然明白了。

解释:
我们先明白有关中转点k的for循环放在最内层和放在最外层的区别是什么。
如果将其放在最内层,我们会反复枚举中转点k,而被中转点连接的两个点i和j只会枚举一次,而如果放在最外层,我们就会反复枚举i和j。这就是两种格式的区别

假设f[i][j]是从i到j的距离

如果我们反复枚举k而有关i和j只枚举一次,由于我们枚举k时不知道此时f[i][k]或
f[k][j]是否是最小值,所以即使当前的f[i][k]+f[j][k]为f[i][j]的最小值但当i或j枚举到k的值时,我们又发现了有关k的新的最小值,而此时我们却没有办法再改变f[i][j]的最小值了,所以放在最内层是错误的。
而如果放在最外层,我们会将与k相连的i和j反复枚举从而求出有关k的最小值,这样就避免了无法改变f[i][j]最小值的尴尬情况。
就是这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值