【校队排位赛#1 A题】 最短路径问题(floyd算法)

在这里插入图片描述

题意:有n个路口,和m条小路,连接两个路口,每条路口都有各自要话费的时间,求从第一个路口到最后一个路口花费的最少时间

写这道题的时候并没有掌握最短路径算法,这道题最后也没能AC。不过也借此机会学一下这类的方法,先从floyd算法开始吧。

该算法解题思路:

1.任意两个路口之间,可能的情况无非是直接一步过去,要么就中间经过若干路口间接到达。那么如果i路口和j路口之间的若有一个中转路口k,i可以先到k再到j。则两点之间的最短时间便是

dp[i][j] = min(dp[i][k]+dp[k][j],dp[i][j])。

然后外层循环遍历k,内层遍历两两端点(路口)即可。

.2. 如果这时候k-j的过程中又有可以中转的路口,而且往后还有好几个类似的呢
这里来个例子讲,以下两两是联通两路口的小路。
5 6
6 7
7 8
8 10
比如我在k=6,要从5到10的时候,也就是拿6做中转,理想上我本应该是dp[5][6]+dp[6][10],应该直接就联通了,但是注意到这里dp[6][10]是没有路的,后面的dp[6][7],dp[7][8]都还没有遍历到,所以在k等于6的时候,dp[5][10]还不能说由5到6再通过6到7、8到10 。

那可是最后就是要dp[5][10]是由5->6->7->8->10的路径联通的呀,怎么实现的呢?
看循环的后续。

当前k=6时,会更新dp[5][7]=dp[5][6]+dp[6][7]。
当k=7时,会更新dp[5][8] = dp[5][7] + dp[7][8]。注意这里的dp[5][7]就是上一步的处理结果。
当k=8时,会更新dp[5][10] = dp[5][8] + dp[8][10]。完成上述的设想。

也就是说两端点间的最小距离会随着中转站的更新而改变/更新。

这也就是floyd算法的精髓了。

还有一种情况是往回折返的,其实就是遍历到低位中转站的时候连接到了高位的端点了,具体如下:
在这里插入图片描述

总体时间复杂度O(n三次方),但是数据规模小可以过。算法本身的思想很棒

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值