算法简介
图最短路径相关算法
- 图最短路径算法总结:
1. 深度优先搜索算法(DFS)
- 解决问题
求图中多源(全源)最短路问题 - 时间复杂度
纯算法时间复杂度O(N^2) - 代码示例
最短路径DFS—无向图和有向图
2. 广度优先搜索算法(BFS)
- 解决问题
求图中多源(全源)最短路问题 - 时间复杂度
纯算法时间复杂度O(N^2) - 特点
比深度优先算法块,更加适用于边权相同的情况 - 代码示例
最短路径BFS—无向图
3. Floyd-Warshall(弗洛伊德算法----只有五行的算法)
- 解决问题
求图中多源(全源)最短路问题 - 时间复杂度
O(N^3) - 特点
- 非常简单,只有五行
- 可以求图中全源最短路问题
- 也可以求单源最短路问题(指定一个顶点到其余各个顶点的最短路径)
- 图中边权可以有负值,但是不可以含有负权回路
- 代码示例
示例图:
.
示例代码:
Floyd-Warshall
3. Dijkstra
- 解决问题
求图中单源最短路问题 - 时间复杂度
- 用一般的图的邻接矩阵法存的话,时间复杂度为O(N^2)
- 对于稀疏图来说,用堆和邻接表存储法,可以将时间复杂度优化为O((M+N)logN),N为顶点数,M为边数.最坏的情况M等于N^2, 那么O((M+N)logN)比O(N^2) 大,但是一般来说边没有那么多,所以O((M+N)logN)比O(N^2)小很多
- 特点
- 可以求图中单源最短路问题
- 时间复杂度为O(N^2),可以优化为O((M+N)logN),N为顶点数,M为边数
- 图中边权不可以有负值
4. Bellman-Ford
- 解决问题
- 求图中单源最短路问题
- 求图中是否存在负权回路
- 时间复杂度
- 未使用队列优化过的:O(NM),N为顶点 M为边
- 使用队列优化过的,最坏的时间复杂度是O(NM),N为顶点 M为边
- 特点
- 是一个无论是思想上还是代码实现上都堪称完美的最短路算法,核心代码只有4行
- 可以处理带有负权边的图
- 经常会在未达到n-1轮松弛前就已经计算出最短路(最多进行n-1轮边的松弛操作,n为顶点数量)
- 优化
- 经常会在未达到n-1轮松弛前就已经计算出最短路,所以这时可以跳出循环,做优化
- 可以使用队列进行优化:每次仅对最短路程发生变化了的点的相邻边执行松弛操作,使用队列保存这些最短路程变化了的点
- 代码示例
示例图:
示例代码:
图邻接表存储法
Bellman-Ford