Files
leetcode-master/problems/kamacoder/最短路问题总结篇.md
programmercarl 96f4622dcf 图论更新
2024-06-13 10:29:09 +08:00

54 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 最短路算法总结篇
至此已经讲解了四大最短路算法分别是Dijkstra、Bellman_ford、SPFA 和 Floyd。
针对这四大最短路算法,我用了七篇长文才彻底讲清楚,分别是:
* dijkstra朴素版
* dijkstra堆优化版
* Bellman_ford
* Bellman_ford 队列优化算法又名SPFA
* bellman_ford 算法判断负权回路
* bellman_ford之单源有限最短路
* Floyd 算法精讲
* 启发式搜索A * 算法
最短路算法比较复杂,而且各自有各自的应用场景,我来用一张表把讲过的最短路算法的使用场景都展现出来:
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20240508121355.png)
因为A * 属于启发式搜索,和上面最短路算法并不是一类,不适合一起对比,所以没有放在一起)
可能有同学感觉:这个表太复杂了,我记也记不住。
其实记不住的原因还是对 这几个最短路算法没有深刻的理解。
这里我给大家一个大体使用场景的分析:
**如果遇到单源且边为正数直接Dijkstra**
至于 **使用朴素版还是 堆优化版 还是取决于图的稠密度** 多少节点多少边算是稠密图,多少算是稀疏图,这个没有量化,如果想量化只能写出两个版本然后做实验去测试,不同的判题机得出的结果还不太一样。
一般情况下,可以直接用堆优化版本。
**如果遇到单源边可为负数,直接 Bellman-Ford**,同样 SPFA 还是 Bellman-Ford 取决于图的稠密度。
一般情况下,直接用 SPFA。
**如果有负权回路,优先 Bellman-Ford** 如果是有限节点最短路 也优先 Bellman-Ford理由是写代码比较方便。
**如果是遇到多源点求最短路,直接 Floyd**
除非 源点特别少,且边都是正数,那可以 多次 Dijkstra 求出最短路径,但这种情况很少,一般出现多个源点了,就是想让你用 Floyd 了。
对于A * ,由于其高效性,所以在实际工程应用中使用最为广泛 ,由于其 结果的不唯一性,也就是可能是次短路的特性,一般不适合作为算法题。
游戏开发、地图导航、数据包路由等都广泛使用 A * 算法。