Skip to content

Lec 14 Johnson's 算法

  • 全源最短路径
  • Johnson's 算法

复习SSSP算法

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

截屏2024-08-02 16.54.57

我们针对单源最短路径(SSSP)问题介绍了这些算法,但在此过程中,我们还展示了如何使用这些算法来解决其他问题。例如,我们可以使用全量深度优先搜索(Full-DFS)或全量广度优先搜索(Full-BFS)来计算图中的连通分量,使用深度优先搜索(DFS)对有向无环图(DAG)中的顶点进行拓扑排序,并使用 Bellman-Ford 算法检测负权重环。

全源最短路径APSP

All-Pairs Shortest Paths(APSP)问题

  • 输入:加权有向图G=(V, E),加权函数w:EZ
  • 输出:返回所有的u,vVδ(u,v), 如果G存在负权重环则中止(因为对于任何一个δ(u,v)=)。由此可以推断出,输出空间O(|V|2),因为需要知道每对顶点的加权最短路径
  • 应用: 对于了解整个网络很有用,比如传输、电路layout、供应链管理等
  • 仅仅是用一个SSSP算法执行|V|次的效果也是挺好的,因为输出大小为O(|V|2)
    • 当权值为正且受限于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中的距离
    • 对于每个sV,计算最短路径树的距离,时间复杂度为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 的路径的权重(局部)不变
  • 这是一个非常通用且很有用的技巧,在保留最短路径性质的前提下转换图形!甚至可以对多个顶点起作用

  • 定义一个势函数v:VZ,将每个顶点vV 映射到一个势函数h(v)

  • 构造图G',与G相同,但边(u,v)E的权重为w(u,v)=w(u,v)+h(u)h(v)

  • 断言2: 在G中的最短路径在G’中也是最短路径

    证明

    • G中路径π=(v0,...,vk)的权重w(π)=i=1kw(vi1,vi)
    • 在G'中π的权重为i=1k(w(vi1,vi)+h(vi1)h(vi))=w(π)+h(v0)h(vk)
      • 每个内部顶点 i 都有正负相抵的 h(vi)
    • v0vk的每条路径的权重变化相同
    • 因此,任何最短路径仍然是最短路径

  • 我们能否找到这样的势函数,使得G'没有负权边?
  • 即,能否存在一个h使得对于每个(u,v)E,都有w(u,v)+h(u)h(v)0
    • 将这个条件重新排列为h(v)h(u)+w(u,v),看起来像是三角不等式!
  • 思路:如果将h(v)δ(s,v)δ(s,v)有限的,则条件将会满足
    • 但是图可能是不连通的,所以可能不存在这样的顶点s
  • 新办法: 添加一个新顶点s, 并向每个vV​添加一个权重为0的有向边,即添加新顶点s指向图中所有的顶点的边。
  • 对于所有的vV,δ(s,v)0,因为存在权重为0的路径。
  • 断言: 如果δ(s,v)=对于任何vV成立,那么原图中一定有负权重环
  • 证明
    • 添加s并不会引入新的环(s没有入边)
    • 所以,如果重新加权后图有负权重环,则原图中也有
  • 或者, 如果对于所有vV,δ(s,v)有限:
    • 根据三角不等式, 对于每个(u,v)E, 有w(u,v)=w(u,v)+h(u)h(v)0
    • 重新加权后的G‘中的新权重是非负的,同时保留了最短路径

Johnson's 算法

  • 本质上是规约算法
    • 将权值可能是正或负ASPS问题,规约成具有相同最短路径性质,且只有非负权重边的图问题
  • 算法步骤
  1. 从G构造Gx, 通过添加顶点x连接到每个顶点vV并设置权重为0

  2. 计算δx(x,v),for each vV(使用Bellman-Ford算法)

  3. 有两种情况

    1. if \existvVδx(x,v)=:
      • 中止(因为G中存在负权重环)
    2. else: 重新加权每条边w(u,v)=w(u,v)+δx(x,u)δx(x,v)以形成图G'
  4. 对于每个uV:

    • 计算G'中所有顶点v的最短距离δ(u,v)(使用Dijkstra算法)

    • 对于所有vV, 计算δ(u,v)=δ(u,v)δx(x,u)+δx(x,v)即可得到图G的关于顶点u的SSSP的解

正确性证明

  • 已经证明从 G 到 G' 的转换保留了最短路径
  • 剩下的归结为 Bellman-Ford 和 Dijkstra 算法的正确性
  • 从带负数权值的 APSP 到非负的 APSP 的简化

时间复杂度分析

  • 构造 Gx 需要 O(|V| + |E|) 时间
  • Bellman-Ford 算法需要 O(|V||E|) 时间
  • 构造 G' 需要 O(|V| + |E|) 时间
  • 运行 V 次 Dijkstra 算法需要 O(|V|(|V|log|V|+|E|))时间
  • 计算从 G' 中的距离到 G 中的距离需要 O(|V|^2) 时间
  • 总时间复杂度为 O(|V|2log|V|+|V||E|)