Chapter 4:paths in graphs
本章讨论寻找最短路径的算法。
1、The distance between two nodes is the length of the shortest path between them.
2、无权图中,用Breadth-first search寻找单源最短路径的伪码(适合有向和无向):
3、DFS和BFS的比较:
DFS | BFS | |
特性 | 纵深发展,直至无法前行才停止 | 以层(到源点的边数)为顺序横向扩展 |
实现方式 | 堆栈 | 队列 |
边的类型(无向图) | 树边、回边 | 树边、横跨边 |
边的类型(有向图) | 树边、回边、前向边、横跨边 | 树边、回边、横跨边 |
顶点顺序 | 两种(入栈顺序、出栈顺序) | 一种(入队顺序和出队顺序相同) |
典型应用 | 连通性测试、无环测试、有向图的强连通分量 | 连通性测试、无环测试、无权图的最短路径 |
复杂度 | 邻接矩阵:Θ(|V|^2),邻接表:Θ(|V|+|E|) | 同左边 |
4、单源最短路径:Dijkstra算法。下图是一个具体例子:
5、Priority Queue 的实现:
- unordered arry
- Binary heap
- d-ary heap
-
- Binary heap是2-ary heap. 假设node[1..n], 则node[j]的parent是floor[(j-1)/d] , children是{ (j-1)d+2, .... , min{n,(j-1)d+d+1} }
比较:(本章没有详细说Fibonacci heap)
6、存在负边怎么计算最短路径:Bellman-Ford 算法
7、最短路径算法总结:
算法 | 适用性 | 时间复杂度 |
BFS | 单源、权恒为1 | O(|V|+|E|) |
Dijkstra | 单源、权非负 | 使用二叉堆:O((|V|+|E|)*log|V|) |
Bellman-Ford | 单源 | O(|V|*|E|) |
DAG最短路径 | 单源、有向无环图 | O(|E|) |
Floyd-Warshall | 多源 | O(|V|^3) |
8、第三第四章简单回忆:
- DFS
- BFS
- 连通分量
-
- 无向图:DFS
- 有向图:DFS,再对逆图DFS
- 最短路径:
-
- 单源最短路径
-
- 无负边:Dijkstra 算法
- 有负边:Bellman-Ford 算法
- 所有点最短路径:Floyd-Warshall 算法
- 最小生成树
-
- Prim 算法
- Kruskal 算法
- 拓扑排序:DFS