Lec 14 Johnson's 算法
- 全源最短路径
- Johnson's 算法
复习SSSP算法
我们主要学写了4个解决SSSP问题的算法,要解决最短路径问题,首先要定义和构造与你的问题相关的图,然后用其中一种算法来解决你的问题。一般来说,你会尽量用最快的方法,Bellman-Ford可以应用到任何加权图问题,但它是最慢的一个,因此我们会优选其他方法。

我们针对单源最短路径(SSSP)问题介绍了这些算法,但在此过程中,我们还展示了如何使用这些算法来解决其他问题。例如,我们可以使用全量深度优先搜索(Full-DFS)或全量广度优先搜索(Full-BFS)来计算图中的连通分量,使用深度优先搜索(DFS)对有向无环图(DAG)中的顶点进行拓扑排序,并使用 Bellman-Ford 算法检测负权重环。
全源最短路径APSP
All-Pairs Shortest Paths(APSP)问题
- 输入:加权有向图G=(V, E),加权函数
- 输出:返回所有的
, 如果G存在负权重环则中止(因为对于任何一个 )。由此可以推断出,输出空间 ,因为需要知道每对顶点的加权最短路径 - 应用: 对于了解整个网络很有用,比如传输、电路layout、供应链管理等
- 仅仅是用一个SSSP算法执行|V|次的效果也是挺好的,因为输出大小为
- 当权值为正且受限于O(|E|+|V|)时, 用BFS的时间复杂度是|V|·O(|V|+|E|)
- 当图是DAG时,用DAG松弛的时间复杂度是|V|·O(|V|+|E|)
- 当权重非负且图为无向图时,用Dijkstra算法的时间复杂度为|V|·O(|V|log|V|+|E|)
- 对于一般情况用Bellman-Ford算法的时间复杂度为|V|·O(|V|·|E|)
方法
- 思路: 在保持最短路径性质的同时使得所有边权重非负。
- 也就是说, 将图G重新加权到图G',使得在G中的最短路径在G'中也是最短路径,并且G'中没有负权重。
- 如果没有负权重边,那么只需要运行|V|次Dijkstra算法就可以解决APSP问题。
- 为什么我们不需要考虑无向图?
- 只需要检查每个边,如果有负权重,就代表有负权重环。线性时间即可
- 断言: 可以在O(|V|(|V|+|E|))时间内从G'中的距离计算出G中的距离
- 对于每个
,计算最短路径树的距离,时间复杂度为O(|V| + |E|) - 这也是G中最短路径树,所以在计算距离的同时通过DFS遍历树
- 需要O(|V|(|V|+|E|))时间(比运行|V|次Dijkstra算法的时间少)
- 对于每个
- 但是,如何使 G' 具有非负边权重呢?这甚至可能吗?
- 断言:如果 G 包含负权重环,则这是不可能的
- 证明:如果没有负权重,最短路径是简单的,但如果有负权重环的最短路径是无限的,不是简单路径。这样是矛盾。
是权重变非负
给定一个具有负权重但没有负权重环的图 G,我们能在保留最短路径的同时使边权重非负吗?
思路1: 将G中最小权重的负值加到每条边上!所有权重都变成非负的! 😃
- 这样做无法保留最短路径,这样会偏向与遍历更少边的路径,(因为它给每条边都加了一个补偿值,路径越长,则更改后路径更长,不公平!)
思路2:给定顶点v, 将h加到所有出边上,并从所有入边上减去h
断言1: 最短路径在上述重新加权下得以保留
证明:
- 以 v 为起点的每条路径的权重变化为 h
- 以 v 为终点的每条路径的权重变化为 −h
- 经过 v 的路径的权重(局部)不变
这是一个非常通用且很有用的技巧,在保留最短路径性质的前提下转换图形!甚至可以对多个顶点起作用
定义一个势函数
,将每个顶点 映射到一个势函数h(v) 构造图G',与G相同,但边
的权重为 断言2: 在G中的最短路径在G’中也是最短路径
证明
- G中路径
的权重 - 在G'中
的权重为 - 每个内部顶点 i 都有正负相抵的
- 每个内部顶点 i 都有正负相抵的
- 从
到 的每条路径的权重变化相同 - 因此,任何最短路径仍然是最短路径
- G中路径
- 我们能否找到这样的势函数,使得G'没有负权边?
- 即,能否存在一个h使得对于每个
,都有 - 将这个条件重新排列为
,看起来像是三角不等式!
- 将这个条件重新排列为
- 思路:如果将
且 有限的,则条件将会满足 - 但是图可能是不连通的,所以可能不存在这样的顶点s
- 新办法: 添加一个新顶点s, 并向每个
添加一个权重为0的有向边,即添加新顶点s指向图中所有的顶点的边。 - 对于所有的
,因为存在权重为0的路径。 - 断言: 如果
对于任何 成立,那么原图中一定有负权重环 - 证明
- 添加s并不会引入新的环(s没有入边)
- 所以,如果重新加权后图有负权重环,则原图中也有
- 或者, 如果对于所有
有限: - 根据三角不等式, 对于每个
, 有 - 重新加权后的G‘中的新权重是非负的,同时保留了最短路径
- 根据三角不等式, 对于每个
Johnson's 算法
- 本质上是规约算法
- 将权值可能是正或负ASPS问题,规约成具有相同最短路径性质,且只有非负权重边的图问题
- 算法步骤
从G构造
, 通过添加顶点x连接到每个顶点 并设置权重为0 计算
(使用Bellman-Ford算法) 有两种情况
- if
, : - 中止(因为G中存在负权重环)
- else: 重新加权每条边
以形成图G'
- if
对于每个
: 计算G'中所有顶点v的最短距离
(使用Dijkstra算法) 对于所有
, 计算 即可得到图G的关于顶点u的SSSP的解
正确性证明
- 已经证明从 G 到 G' 的转换保留了最短路径
- 剩下的归结为 Bellman-Ford 和 Dijkstra 算法的正确性
- 从带负数权值的 APSP 到非负的 APSP 的简化
时间复杂度分析
- 构造
需要 O(|V| + |E|) 时间 - Bellman-Ford 算法需要 O(|V||E|) 时间
- 构造 G' 需要 O(|V| + |E|) 时间
- 运行 V 次 Dijkstra 算法需要
时间 - 计算从 G' 中的距离到 G 中的距离需要 O(|V|^2) 时间
- 总时间复杂度为