关于floyd遍历顺序为什么是kij

本文探讨了Floyd算法中遍历顺序从kij到ijk的变化,指出ijk可能导致不正确的结果,因为它不符合动态规划的顺序要求,尤其是在数据范围较大时。作者通过例子解释了为何kij的顺序正确且ijk在特定条件下可行。

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


      众所周知,floyd是用来求多源最短路(即有多个源点)的算法,算法的主要思想是在i,j两点间找一点k,使i,j经过k的路径更短,更新i到j的最短路径(具体请看图1)

图1
图一(floyd算法示意图)


      又众所周知,floyd要三层循环,遍历的顺序是kij(此处kij和上文代表意思相同),也就是先枚举一个点,然后再枚举所有点能否经过这个点更新路径;
      那如果把遍历的顺序改成ijk呢
      我写了一个程序,遍历顺序取ijk,交上去WA,这证明了ijk的遍历顺序是错的;
      为什么不能是ijk?
      我画了一张图(图2)

      由瞪眼法得,1点到5点的最短路长度为6(即1->3->4->5)
      我们假设此时i = 1,j = 5,k = 4
      由于1和4之间目前没有最短路(在数组里设成一个非常大的数,以下称为无穷大),可以发现无穷大+2不会小于无穷大,所以不会更新
      这样一直不更新,i不再等于1,j不再等于5,造成了WA
      如果是kij就不一样了,即使一次没更新,之后也能求出最短路
      现在,k依然和上文一样等于4,但是遍历一遍ij,可以发现5和3之间的最短路等于4,不是无穷大
      等k到3时,i再次等于1,j再次等于5,求出最短路
      你可以理解成动态规划,遍历是要有顺序的,把i到j的最短路看作一个状态,要用到的状态并不全,有的还并未求出,就导致了状态转移方程里包含无穷大
      目前没有人把floyd看成动态规划,如有错误,请提出,我会尽快修改
      到此,ijk为什么不对以及kij为什么对已经说明了
      最后补充一点,图2中的数据用ijk的floyd可以过,因为ijk不可能按这个顺序遍历,不能直接就i = 1,j = 5,k = 4,只是为了简单易懂出了这组数据
      但是,如果数据范围特别大呢?ijk遍历就会WA
      

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值