算法导论第24章:单源最短路径

目录

Bellman-Ford算法

有向有负环图

有向有非负环图(练习24.1-3)

找到负环上的所有结点(练习24.1-6)

DAG中的单源最短路径问题

有向无环图

S到V的路径总数(练习24.2-4)

Dijkstra算法

有向无负权图

Bellman-Ford算法

有向有负环图

算法:对所有E松弛V-1次,若还存在可松弛的结点,说明存在负环

运行时间:O(VE)

算法导论第24章:单源最短路径_第1张图片

证明:每次对所有边松弛,至少松弛了E(S, V)最短路径上的一条边。

有向有非负环图(练习24.1-3)

算法:重复对所有E松弛,直到没有可松弛的E(共松弛m+1次)

运行时间:O(mE),其中源节点到目标结点的最多边数为m

找到负环上的所有结点(练习24.1-6)

算法:对所有E松弛V-1次,若还存在可松弛的v,对其重复寻找父节点并标记 

DAG中的单源最短路径问题

有向无环图

DP算法:拓扑排序,按拓扑序松弛每一条边

算法导论第24章:单源最短路径_第2张图片

运行时间:O(V+E)

证明:精髓在于“路径松弛定理”

S到V的路径总数(练习24.2-4)

算法:拓扑排序,按拓扑序对S到V的结点做:将此节点的方法数加到他的邻接结点

运行时间:O(V+E)

Dijkstra算法

有向无负权图

算法:每次选取d最小的结点入队,并同时松弛它邻接的边

算法导论第24章:单源最短路径_第3张图片

运行时间:依赖于优先队列的实现方式,数组O(V²),二叉堆O((V+E)lgV)

证明每次选的结点v已经达到了δ(s,v):因为再走其它路肯定更远

你可能感兴趣的:(算法导论)