最短路径
1|0拓扑序
有这样一个问题:
我们给定一张
个点 条边的有向无环图(DAG),请求出从 号结点出发,到达任意结点的最短路径,保证 可以到达任意结点, 。
我们以下面这张图为例。
如果我们想求
我们发现,上图我们按照
该解法的时间复杂度是
2|0Floyd
上面我们讨论了从某一固定结点出发到达其他任何一个其他结点的最短路径,这种问题被称为单源最短路问题,有时候我们也会关心从任意结点,到任意结点的最短路径,这样的问题被称为全源最短路问题。
我们有一个简单的算法可以解决这样的问题。Floyd 算法的思路是,我们每次枚举一个中间结点,利用这个中间结点更新任意两点之间的最短路。 由于是求任意两点的最短路,所以我们经常采用邻接矩阵模型解决这个问题。
该解法的时间复杂度是
以最上面那张图为例,当我们枚举
接着我们再枚举
我们不难发现,只需要按照上述规则归纳下去,经过
3|0Dijkstra
Dijkstra 算法解决的是单源最短路的且边权全为正的问题,它的思想大致是:每次选择一个最短路径长度已经确定的结点,然后通过从这个结点出发的边,更新其余还未完全确定最短路径长度的结点。这样反复确定
因为边权为正数,所以当前未考虑的距离最小的结点一定不会被当前未考虑的距离较大的结点再额外加一条边给更新,所以从贪心的角度来说,当前未考虑的距离最小的 结点其最短路径长度已经确定下来了。
该解法的时间复杂度为
当图为稀疏图时,我们可以使用堆对 Dijkstra 算法进行优化。
上面的解法中我们用循环找出最短路径长度最小的结点,我们可以采用一个堆,维护一个二元组,包含结点编号
该解法的时间复杂度是
4|0Bellman-ford
Bellman-ford 算法适合在图存在负权边的时候求解单源最短路。这是因为,当我们运行 Dijkstra的时候,我们依赖一个性质,就是当前未确定最短路的结点之中,最短路长度最小的结点它的最短路实际已经确定下来了。反过来想,如果我们未确定该结点的最短路,那么到其他结点的最短路都比到该结点的最短路长,加上一条正权边之后,路径长度只会更长,所以最短路长度最小的结点,它的最短路已经确定下来了。
但是如果有负权边,那就不一定了,我们不能保证当前未确定最短路的结点之中最短路长度最小的结点的最短路已经确定下来了,因为我们可能先移动到一个最短路比它长的结点,然后通过经过一条负权边的方法使得答案变得更小。
而 Bellman-ford 算法的思想大致是如果图里存在一条最短路,那么最短路的长度不会超过
该解法的时间复杂度是
5|0使用队列优化 Bellman-ford(SPFA)
注意,该解法最坏情况下时间复杂度还是
__EOF__

本文链接:https://www.cnblogs.com/shimingxin1007/p/18199172.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架