算法导论(第24章 单源最短路径)
第24章 单源最短路径
问题描述
给定一个带权重的有向图
图中一条路径
定义从结点
从结点
22.2节讨论的广度优先搜索算法就是一个求取最短路径的算法,但该算法只能用于无权重的图。
最短路径的几个变体
- 单源最短路径问题
- 单目的地最短路径问题
- 单结点对最短路径问题
- 所有结点对最短路径问题
最短路径的最优子结构
最短路径算法通常依赖最短路径的一个重要性质:两个结点之间的一条最短路径包含着其他的最短路径。
而最优子结构是可以使用动态规划(第15章)和贪心算法(第16章)的一个重要指标。相应的,后面在24.3节讨论的
- 引理24.1(最短路径的子路径也是最短路径)
负权重的边
环路
最短路径的表示
松弛操作
最短路径和松弛操作的性质
-
三角不等式性质
-
上界性质
-
非路径性质
-
收敛性质
-
路径松弛性质
-
前驱子图性质
本章概要
24.1节讨论
算法,该算法解决的是一般情况下的单源最短路径问题(边的权重可以为负值)。 算法还能够侦测是否存在从源结点可以到达的权重为负值的环路。
24.2节给出在有向无环图中计算单源最短路径的线性时间的算法。
24.3节讨论
算法,该算法的时间复杂度低于 算法,但要求边的权重为非负值。
24.4节描述如何使用
算法来解决线性规划中的一种特殊情况。
24.5节给出最短路径和松弛操作的性质的证明。
本章所讨论的所有算法都假定有向图
24.1 算法
算法解决的是一般情况下的单源最短路径问题,在这里,边的权重可以为负值。
给定带权重的有向图
BELLMAN-FORD(G, w, s)
1 INITIALIZE-SINGLE-SOURCE(G, s)
2 for i = 1 to |G.V| - 1
3 for each edge(u, v) ∈ G.E
4 RELAX(u, v, w)
5 for each edge(u, v) ∈ G.E
6 if v.d > u.d + w(u, v)
7 return FALSE
8 return TRUE
- 算法第1行对所有结点的
值和 值进行初始化。 - 算法第2~4行对每条边进行
次松弛操作。 - 算法第5~8行检查图中是否存在权重为负值的环路并返回与之相应的布尔值。
算法的复杂度为 。
24.2 有向无环图中的单源最短路径问题
24.3 算法
算法解决的是带权重的有向图上单源最短路径问题,该算法要求所有边的权重都为非负值。
DIJKSTRA(G, w, s)
1 INITIALIZE-SINGLE-SOURCE(G, s)
2 S = Ø
3 Q = G.V
4 while Q ≠ Ø
5 u = EXTRACT-MIN(Q)
6 S = S ∪ {u}
7 for each vertex v ∈ G.Adj[u]
8 RELAX(u, v, w)
- 算法第1行执行的同样是
值和 值进行初始化。 - 算法第2行将集合
初始化为一个空集。 - 算法第3行对最小优先队列
进行初始化。(算法所维持的不变式为 ) - 算法第4~8行从
中抽取结点 并加入到 中,对所有从结点 发出的边 进行松弛操作。
算法的复杂度依赖于最小优先队列的实现。
- 如果采用数组,则复杂度为
- 如果采用二叉堆,则复杂度为
(若所有结点都可以从源结点到达,则该时间为 ) - 如果采用斐波那契堆,则可改善为
24.4 差分约束和最短路径
24.5 最短路径性质的证明
-
引理24.11(上界性质) 设
为一个带权重的有向图,权重函数为 ,源结点为 ,该图由算法 执行初始化。那么对于所有的结点 , ,并且该不等式在对图 的边进行任何次序的松弛过程中保持成立。而且一旦 取得其下界 后,将不再发生变化。 -
引理24.13(收敛性质) 设
为一个带权重的有向图,权重函数为 。设 为某个源结点, 为图 中的一条最短路径,这里 。假定图 由 算法进行初始化,并在这之后进行了一系列边的松弛操作,其中包括对边 的松弛操作 。如果在对边 进行松弛操作之前的任意时刻有 ,则在该松弛操作之后的所有时刻有 。
证明:根据上界性质——如果在对边
进行松弛前的某个时刻有 ,则该等式在松弛操作后仍然成立。所以松弛操作之后,仍然有 。 根据最优子结构的性质,在对边
进行松弛后,有 又根据上界性质,我们有
。 由夹逼定理:
,并且该等式在此之后一直保持成立。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步