您的位置:首页 > 编程语言 > Go语言

《Algorithms》第4章:Paths in graphs 学习笔记

2012-07-05 17:35 417 查看
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的比较:

DFSBFS
特性纵深发展,直至无法前行才停止以层(到源点的边数)为顺序横向扩展
实现方式堆栈队列
边的类型(无向图)树边、回边树边、横跨边
边的类型(有向图)树边、回边、前向边、横跨边树边、回边、横跨边
顶点顺序两种(入栈顺序、出栈顺序)一种(入队顺序和出队顺序相同)
典型应用连通性测试、无环测试、有向图的强连通分量连通性测试、无环测试、无权图的最短路径
复杂度邻接矩阵:Θ(|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 算法

这篇文章详细介绍了此算法:http://www.cppblog.com/infinity/archive/2008/11/11/66621.html

7、最短路径算法总结:

算法适用性时间复杂度
BFS单源、权恒为1O(|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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: