最短路
最短路问题,顾名思义就是要求图上的某点到另外一点的最短距离,爆搜就不用说了。
令图上点数为
由于考虑的是最短路,那么包含负环的图就不能算了,没有最短这一说。
正权图最短路性质:任意两点间的最短路都不会经过重复的点和重复的边。
优点
Floyd 可以求出两两节点间的最短路,码量较低,可以找到负权图的最短路。
缺点
时间复杂度高。
令 f[k][i][j]
表示在只经过(f[n][i][j]
就是原图上
初始时 f[k][i][j] = min(f[k - 1][i][j], f[k - 1][i][k] + f[k - 1][k][j])
。
优化一下,第一维对结果无影响,变为二维 f[i][j]
。
时间复杂度:
优点
可以找到负权图的单源最短路,可以判负环。
缺点
时间复杂度仍比较高。
松弛操作:对于边
Bellman-Ford 就是不断尝试松弛图上的边,每次循环都枚举每条边,看是否能松弛,如果所有的边都无法松弛了,那么最短路也就求完了。
在最短路存在的情况下,最多只会经过
tips:如果想用 Bellman-Ford 判负环,那么最保守的方法是建立一个超级原点,向每个节点都连一条边权为
的边,在以它为原点做 Bellman-Ford 即可。
时间复杂度:
队列优化 SPFA
关于 SPFA,它死了。
很显然,只有上一轮被更新的节点所连出去的边,才有可能是可以松弛的边,可以用队列维护哪些节点可能引起松弛操作。
SPFA 大多数情况下跑到快,可最差仍然是
优点
时间复杂度低,可以求出单源或者多源最短路。
缺点
一遇到负权就寄。
主要思想:使用优先队列存储一些访问到的节点的编号和最短路长度,优先队列肯定按最短路长度从小到大。
当取出了一个队头时,如果这个节点没有被取出来过,那么就记录好答案,将它所连出去的边都进行一次松弛。
当松弛
时间复杂度:
本文作者:wnsyou の blog
本文链接:https://www.cnblogs.com/wnsyou-blog/p/shortest_path.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步