“当图稀疏且无负环时,Johnson 算法以势函数重赋权后从每点运行 Dijkstra,时间随 $m$ 而非固定 $n^3$;它与 Floyd–Warshall 的稠密矩阵 DP 是不同成本区…”
形式陈述 ​
输入是有限有向图
最短路三角不等式
任意
直觉 ​
势函数给每个顶点换一个高度零点。单条边的坡度随两端高度改变,但一条完整路径的变化只由起终点决定;所以可以消除局部负边,而不改变同一对端点之间的路径排名。非负新权让 Dijkstra 可用,最后再撤销端点偏移。
Bellman–Ford 不只是预处理负边,它同时生成保证非负性的可行势,并充当负环证书。随意选择
例子与边界 ​
设边
若图含可达负环,某些端点间可以绕环任意降低路径权,距离不是有限值;算法必须停止,不能继续重赋权。不可达点在各次 Dijkstra 中保持无穷,恢复公式也不能对无穷做普通实数运算。
重赋权只保留路径总权的相对次序,不保留每条边原值。输出若需要路径长度必须恢复,若需要具体路径则保存每次 Dijkstra 的前驱即可,因为最短路径的边序列没有改变。
推论与应用 ​
Johnson 适合边数远小于
势函数重赋权也出现在最小费用流等算法中。可复用的核心不是“先跑一次 Bellman–Ford”的步骤表,而是端点伸缩不变量与所有残余边非负的证明。
参考资料
- Donald B. Johnson, “Efficient Algorithms for Shortest Paths in Sparse Networks,” Journal of the ACM 24(1), 1977, pp. 1–13.
- Thomas H. Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, §23.3.