题解 [LuoguP5905]【模板】Johnson 全源最短路

Johnson算法是用于解决包含负权边的图的全源最短路问题。通过新增虚拟节点、修改边权并结合Bellman-Ford与Dijkstra算法,实现O(nmlogn)的时间复杂度。文章详细介绍了算法步骤、证明了权值调整后的最短路不变,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

以此纪念我学会该算法。

Johnson 全源最短路

Johnson 全源最短路可以用来求有负权的图的全源最短路。

步骤

  1. 新建一个虚拟 0 0 0 号节点。

  2. 在节点 0 0 0 至节点 i ( i ∈ [ 1 , n ] ) i(i \in [1,n]) i(i[1,n]) 中插入一条权值为 0 0 0 的有向边。

  3. 使用 Bellman-ford 算法(SPFA 也可)计算节点 0 0 0 到其它节点的最短路径(顺便判断负环),记为 H i H_i Hi

  4. 将原图每条边的权值 w u , v w_{u,v} wu,v 改为 w u , v + H u − H v w_{u,v}+H_u-H_v wu,v+HuHv

  5. n n n 轮 Dijkstra 算法,求出全源最短路。

复杂度: O ( 1 ) + O ( n ) + O ( n m ) + O ( m ) + n ∗ O ( ( n + m ) log ⁡ n ) = O ( n m log ⁡ n ) O(1)+O(n)+O(nm)+O(m)+n*O((n+m)\log n)=O(nm\log n) O(1)+O(n)+O(nm)+O(m)+nO((n+m)logn)=O(nmlogn)

证明

如何证明 w u , v + H u − H v ≥ 0 w_{u,v}+H_u-H_v \geq 0 wu,v+HuHv

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值