有负权最短路的近线性算法 (Bringmann, Cassis, Fischer, 2023)
我们知道, 2022 年, Bernstein, Nanongkai 和 Wulff-Nilsen 提出了一个惊人的
这里的
按照我的书写逻辑, 有些东西的定义不是一开始写出来就是精确的, 而是在讲述的过程中逐渐推出, 所以不能和论文的写作顺序完全对应.
前置
在我们对 Goldberg, 1995 的介绍里提到的 pricing (在 [BCF23] 中被称作 Johnson's trick) 和 scaling 这两个技术仍然是我们所依赖的基本技术. 大概来说就是:
- pricing (Johnson's trick) 是给一个没有负环的图进行重新赋权, 让它变成一个没有负权边的图.
- scaling 是说对于整数边权的图, 我们本质上只需要解决的是
的情况.
如果不知道以上两点是什么意思, 可能需要看一看前文再继续阅读.
低直径分解的应用
[BNW22] 和 [BCF23] 的技术核心都在于考虑了所谓的低直径分解 (low diameter decomposition), 注意在这两篇文章里定义有所不同, 因为不同的要求会需要不同的算法, 也导出不同的后果, 这是 [BCF23] 能去掉很多个
对于一个图
我们称
低直径分解是这样一个东西: 假设我们能找到一个边集的子集
- 删去
后, 图中每个强连通分量 要么满足 , 要么满足 . 这被称为 progress. - 对于
到任何一个 的最短路, 最短路经过 上的边数是 的. 这被称为 sparse hitting.
现在, 假设我们真的有一个计算低直径分解的算法, 现在考虑如何运用它来计算出
算法 SSSP(
, ) 定义如下:
- 如果
, 我们可以按照如下方法计算出最短路: 先删去所有的负权边跑一遍最短路, 然后用负权边松弛一遍, 再跑最短路. 如此执行 遍之后, 就计算出了真正的最短路, 返回. - 否则, 求出一个给出低直径分解的边集
, 对每个强连通分量 , 如果 , 调用 SSSP( , ), 否则调用 SSSP( , ). 从而得到这每个子图的势 . - 考虑缩点之后的拓扑序, 我们可以 DP 得到整个图
的势函数 . 这使得重赋权之后 之外的边都是非负的. - 依然使用 1. 中的: "跑一次最短路, 然后用
中的边松弛" 的策略, 直到松弛对答案没有任何改进为止, 此时给出了整个图 的势函数 .
由于递归的过程中
因此, 忽略求解低直径分解的时间, 我们这部分的时间复杂度是
为了让低直径分解 真的存在, 我们其实还对
寻找低直径分解的算法
在叙述真正的低直径分解之前, 我们需要引入一些概念.
刚刚提到的
我们记
对于非负权图
我们称一个点是 out-heavy 的当其满足
引理 (轻重判定 (Heavy-Light Classification)). 存在
复杂度的算法, 对每个节点 , 给出一个 label, 要么是 in-heavy 要么是 in-light, 并且有高概率使得对于每个节点, 这个 label 都是正确的.
这个引理的证明我们先放在后面, 我们先叙述真正的低直径分解算法.
算法 Decompose(
, ) 定义如下:
- 进行轻重判定, 得到被标记为 in-light 和 out-light 的点集, 记为
和 . - 设边集
初始为空. - while
非空, 选取其中一个节点 , 以及生成一个随机数 , 服从 的几何分布. 给 加入所有 , 并把 删去所有 中的点. - 类似地, 对
做一样的事. - 返回
.
让我们首先分析一下这个算法的复杂度. 首先 1. 是我们延后的东西, 我们预设它在
正确性: sparse hitting
接下来我们证明这个算法确实满足我们前面要求的 sparse hitting 性质.
对于任何一条边
- 如果
, 说明它们都没被删掉, 被鸽到下一轮. - 如果
而 , 说明 , 被加到 里. - 如果
, 那么这轮就被删了, 绝不会再有机会加到 里.
我们可以考虑这么一个转化来控制总共发生的概率, 考虑将问题放宽: 我们有个 adversary 按照
因此, 设
所以, 在
那么对于任何超级源点
对于
fix: 对 SSSP 的改进
注意到我们这里对
所以, 我们要对松弛操作做一点点精细的调整, 我们只有那些在上一轮被松弛了的点才考虑下一轮再用负边松弛别的点. 这样就能保证每个点的松弛次数是不超过
正确性: progress
我们考虑每次对于某个
显然, 此时的
所以 union bound 保证了有很大的概率, 在整个算法的执行过程中, 一次
但是还剩下一部分 SCC 是在剩下的节点里的. 由于所有被标记成 light vertex 的都会被删掉, 我们剩下的 SCC 里的节点一定全都是 in-heavy 并且也是 out-heavy 的.
为了保证
图的均值最小的回路
显然这个性质仍然是传递的, 所以只要一开始保证了就行. 但显然并非无负环的图都能满足这个性质, 所以我们为了满足它, 需要对传统的 scaling 手段做一些修改, 这部分处理我们放在后面.
现在反设
因此, 在满足限制的情况下, 没有被删掉的
轻重判定的技术细节
注意我们只需要清晰地分辨出
我们随机地选取
这部分跑了
scaling 的技术细节
这里采用的 scaling 策略稍微曲折一点: 若一张图
具体的方法是, 对于一张图
所以平均长度也满足了.
最后我们证明这个跑出来的势能确实让边权变大了. 对于
现在还剩下最后一个问题, 就是我们最后只是成功让图的边权
所以我们实际上需要对刚刚这个过程做一点修改: 在最开始, 把整个图每条边的权值乘以
我们分析这个做法的正确性: 由于我们一开始把整个图的边权乘以了
所以, 我们 scaling 的实际迭代次数是
延伸
如此下列, 我们知道了, 在图不存在负环的时候, 本算法能在期望
[BCF23] 中还进一步解释了如何在同样时间复杂度内找出一个负环, 甚至找出一个均值最小的环. 不过本文可以就此打住了.
参考文献
[BNW22] Aaron Bernstein, Danupon Nanongkai, Christian Wulff-Nilsen, 2022. Negative-Weight Single-Source Shortest Paths in Near-Linear Time.
[BCF23] Karl Bringmann, Alejandro Cassis, Nick Fischer, 2023. Negative-Weight Single-Source Shortest Paths in Near-Linear Time: Now Faster!
[MT04] Mikkel Thorup, 2007. Integer priority queues with decrease key in constant time and the single source shortest paths problem.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)