关于floyd算法的理解

求最短路时一般比较有名的算法是spfa和dijkstra,而spfa的时间复杂度是玄学(本质上就是bfs加多重更新优化),在某年NOI,出现了SPFA算法死了的情况(卡了40分),堆优化dijkstra是最优秀的,稳定的nlogn复杂度。

不过对于spfa和dijkstra,要注意这两种算法,都是针对单源最短路的,如果要求多源最短路,一种算法是进行n次堆优化dijkstra,复杂度为n^2logn,还有一种非常好写的算法,floyd算法,n^3时间复杂度可以求出所有点对之间的距离。

理解floyd算法其实就是理解动态规划。

定义一个数组 f[k][x][y] ,表示只允许经过结点 1 到 k(这个非常重要),结点 x 到结点 y 的最短路长度。

很显然, f[n][x][y] 就是结点 x 到结点 y 的最短路长度。

考虑怎么求这个数组 f[0][x][y] :边权,或者 0 ,或者 正无穷     ( f[0][x][x] 什么时候应该是 正无穷?) f[k][x][y] = min(f[k-1][x][y], f[k-1][x][k]+f[k-1][k][y])

上面两行都显然是对的,然而这个做法空间是 O(N^3) 。

但我们发现数组的第一维是没有用的,于是可以直接改成 f[x][y] = min(f[x][y], f[x][k]+f[k][y]),因为拿k做过渡点更新的结果,不可能再次用来更新其它以k作为过渡点的点对,所以完全可以把维数压成一维。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值