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 算法
     这篇文章详细介绍了此算法:http://www.cppblog.com/infinity/archive/2008/11/11/66621.html



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










posted on 2012-07-05 17:35  zyearn  阅读(217)  评论(0编辑  收藏  举报