Floyd-Warshall算法可以求解出图内任意两点的最短路径,适用于稠密图,但时间复杂度为 \(O(n³)\);Dijkstra算法求解单源最短路径的时间复杂度为 \(O(m + n log n)\),对每个节点都做一次,也可以达成全源最短路径,但是这个方法仅适用于非负权边图。

Johnson 算法被设计来解决此问题,其支持负权边(当然不能有负权环)。综合两个算法的优势,时间复杂度 \(O(nm + n² log n)\),在稀疏图中显著优于 Floyd-Warshall,结合了 Dijkstra 的高效性与 Bellman-Ford 的灵活性。

1 添加虚拟节点

  • 操作:在原始图 \(G\) 中添加一个虚拟节点 \(s\),并添加从 \(s\) 到所有原节点的边,权重为0。
  • 目的:为后续计算势能函数做准备。

2 计算势能函数 \(h(v)\)

  • 步骤

    1. 使用 Bellman-Ford 算法 计算从 \(s\) 到所有原节点的最短路径,结果记为 \(h(v)\)。
    2. 若检测到负权环,算法终止(此时原图无有效最短路径)。

3 调整边权为非负值

  • 公式:对原图中每条边 \((u, v)\),调整权重为:
    \[w'(u, v) = w(u, v) + h(u) - h(v)
    \]
  • 关键性质:经过这样调整,调整后所有新的边权重 \(w'(u, v)\) 均为非负。且满足“原图的最短路同样是新图的最短路”

4 运行Dijkstra算法

  • 操作:对调整后的图,为每个节点 \(u\) 运行一次Dijkstra算法,得到最短路径 \(d'(u, v)\)。

5 还原原始最短路径

  • 公式:原始图中 \(u\) 到 \(v\) 的最短路径为:
    \[d(u, v) = d'(u, v) - h(u) + h(v)
    \]

为什么是对的?

1 边权调整的非负性

\(h\) 是虚拟点到节点的距离,根据 Bellman-Ford 的最短路径性质,对任意边 \((u, v)\) 有:

\[h(v) \leq h(u) + w(u, v)
\]

移项得:

\[w(u, v) + h(u) - h(v) \geq 0
\]

因此,调整后的权重 \(w'(u, v)\) 非负,Dijkstra算法可正确运行。

2 最短路径的等价性

设原图中一条路径 \(p = v₀ → v₁ → ... → vₖ\) 的权重和为:

\[W(p) = \sum_{i=0}^{k-1} w(v_i, v_{i+1})
\]

调整后的权重和为:

\[W'(p) = \sum_{i=0}^{k-1} [w(v_i, v_{i+1}) + h(v_i) - h(v_{i+1})] = W(p) + h(v₀) - h(v_k)
\]

路径上的 \(h\) 被抵消,由于 \(h(v₀) - h(v_k)\) 是常数,原图与新图上任意对应两个点之间的所有路径都只相差常数,那么原图最短路径仍然是新图最短路径。

时间复杂度分析

步骤 时间复杂度
Bellman-Ford \(O(nm)\)
n 次 Dijkstra \(O(n(m + n log n))\)
总时间 $O(nm + n² log n) $
  • 适用场景:稀疏图时,时间接近 \(O(n² log n)\),远优于Floyd-Warshall的 \(O(n³)\)。稠密图上差距缩小。

Johnson 全源负权最短路径算法详解的更多相关文章

  1. sip鉴权认证算法详解及python加密

    1. 认证和加密    认证(Authorization)的作用在于表明自己是谁,即向别人证明自己是谁.而相关的概念是MD5,用于认证安全.注意MD5仅仅是个hash函数而已,并不是用于加密.因为ha ...

  2. Johnson 全源最短路径算法

    解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...

  3. Johnson 全源最短路径算法学习笔记

    Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...

  4. 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?

    简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...

  5. 【学习笔记】 Johnson 全源最短路

    前置扯淡 一年多前学的最短路,当时就会了几个名词的拼写,啥也没想过 几个月之前,听说了"全源最短路"这个东西,当时也没说学一下,现在补一下(感觉实在是没啥用) 介绍 由于\(spf ...

  6. Johnson全源最短路

    例题:P5905 [模板]Johnson 全源最短路 首先考虑求全源最短路的几种方法: Floyd:时间复杂度\(O(n^3)\),可以处理负权边,但不能处理负环,而且速度很慢. Bellman-Fo ...

  7. Johnson 全源最短路

    学这个是为了支持在带负权值的图上跑 Dijkstra. 为了这个我们要考虑把负的权值搞正. 那么先把我们先人已经得到的结论摆出来.我们考虑先用 SPFA 对着一个满足三角形不等式的图跑一次最短路,具体 ...

  8. “全栈2019”Java多线程第八章:放弃执行权yield()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. 第三十节,目标检测算法之Fast R-CNN算法详解

    Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2 ...

  10. 第三十一节,目标检测算法之 Faster R-CNN算法详解

    Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...

随机推荐

  1. 三菱电梯IC卡系统数据库备份与恢复

    查看msde2000的登录方式 sa密码lonele 64位操作系统下 reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsof ...

  2. linux 安装 docker

    1.安装 yum-utils yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 --skip-broken 执行如果 报错 ...

  3. Vue3 组合式API

    1.入口 创建实例时,配置setup方法,然后其内部书写组合式API代码,通过组合式API生产的数据和返回,需要暴漏出去才能给HTML使用 <script> //组合式(解构赋值) con ...

  4. 论文解读《From Generation to Judgment: Opportunities and Challenges of LLM-as-a-judge》

    发表时间:2024 期刊会议:arxiv 论文单位:Arizona State University 论文作者:Dawei Li, Bohan Jiang, Liangjie Huang, Alimo ...

  5. element 表格增加多选框 ,增加多选

    1. el-table 增加如下代码,就会出现多选框 <el-table-column type="selection" class="checkbox-inp&q ...

  6. 体验.NET与文件存储服务MinIO

    对象文件存储服务(OSS)主要用于存储零散的文件,和直接存储到本地文件系统中相比,有以下的几个优势: 跨服务器可用 兼容Amazon S3 API 横向扩容 高可用 支持加密 MinIO就是一个高性能 ...

  7. 开源架构Fabric、FISCO BCOS(以下简称“BCOS”)、CITA 技术对比

    转自 https://www.coingogo.com/news/41300 联盟链技术哪家强?开源架构Fabric.FISCO BCOS(以下简称"BCOS").CITA 技术对 ...

  8. Jenkins入门使用

    Jenkins入门使用 1先安装jdk才能运行jenkins yum install -y java-1.8.0-openjdk.x86_64 2 安装jenkins,运行,进行端口绑定,启动jenk ...

  9. IM通讯协议专题学习(五):Protobuf到底比JSON快几倍?全方位实测!

    本文由陶文分享,InfoQ编辑发布,有修订和改动. 1.前言 本系列的前几篇主要是从各个角度讲解Protobuf的基本概念.技术原理这些内容,但回过头来看,对比JSON这种事实上的数据协议工业标准,P ...

  10. 20. C++快速入门--并发基础

    参考:<Professional c++>,<并发编程实战> 1 基本概念 1.1 竞争 原子性 "原子"(atomic)操作是指一种不可分割的操作, 即在 ...