[算法]Floyd-Warshall算法理解

关于弗洛伊德算法,各种资料都有介绍(如Wiki:https://zh.wikipedia.org/wiki/Floyd-Warshall%E7%AE%97%E6%B3%95),但是有一点疑问一直困惑了我很久,知道今天才想明白哈(感谢学长帮助~)。

图的有关信息存储在邻接矩阵中,弗洛伊德算法大体上是尝试找各个中转点,看能否减少顶点与顶点间的路径,以计算出任意两个顶点之间的路径长度。尝试各个中转站的步骤一般都在最外层的for循环中,而且一般是从小到大依次遍历。我之前一直感觉,这种遍历方式只能找其中一部分遍历路径的最小值。举个例子,我当初认为,从顶点1到顶点5,我们通过这种方法找到类似 1-2-5;1-3-5;1-2-4-5这种路径,路径中的顶点必须从小到大依次排列。那么有一些路径如1-3-2-5就无法遍历的到。(因为我感觉for循环的最外层是从1到n,那么中间点只能从小到大排列)困惑了我好久……今天与学长交流才明白,弗洛伊德算法是没有问题的(废话……),应该这样理解:随着for循环最外层的中转站依次遍历,那么在该次中转的时候(比如k),每一个中转站已经是包含是否经过前(k-1)个中转站的最短路径了,所以遍历到最后,一定是正确答案。
不知道我讲明白没有……举个例子,假如说我想看看1-3-2-5这种路径方式,那我一定是在尝试通过3中转站的时候进行的。此时我们会计算1-3,3-5的路径之和,然而3-5这条路径已经包含了3-2-5这种可能(尽管3-5不一定非要经过2这个中转站,比如还可能是3-1-5,但绝对不可能是3-4-5,因为这个时候最外层的中转站只遍历到3)。那么以此类推,当最外层的中转站遍历到最后,各个矩阵中存储的一定是两顶点间的最短路径。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值