优化搜索具有 N 个顶点和 N 条边的图中的所有最短路径

Optimizing search of all the shortest paths in a Graph with N vertices and N edges

我需要找到图中所有对之间的最短路径 G。我正在使用 Floyd–Warshall 算法来计算解决方案。

我想知道是否有更好的选择来找到所有关于 G 的最短路径:

  1. G是一个无向图。
  2. 顶点数和边数相同
  3. 所有的边权重都是正的。

鉴于这些事实,是否有比 Floyd–Warshall 更好的解决方案?

对稀疏图的 Dijkstra 最短路径算法进行了修改,该算法运行速度非常快,并揭示了对数线性(接近线性)渐近行为。您需要从 N 个顶点进行 N 次搜索,从而提供比 O(N^3) Floyd–Warshall 算法更好的 O(N^2*LogN) 渐近时间。

可能你的图有特殊的拓扑结构,允许更有效的方法...

C++ code with Russian description(可译为Google Chrome)

我有 delphi 网格图的实现 here

你试过约翰逊算法吗?它似乎完全解决了您的问题,即稀疏加权图上的 APSP(没有负权重的圆圈) https://en.wikipedia.org/wiki/Johnson%27s_algorithm

感谢@MBo @DubioserKerl,这是找到的最佳方法。

因为有 N 个顶点和 N 个边并且图是连通的,我们知道只有一个环,所以环可以是 "compressed" 和将该循环的 "contentedness" 与图表的其余部分一起保存。

例如,在下图中,我们可以替换循环 c-d-e-g 并创建一个新节点 h 并保存循环

的所有外部关系
a -> c
b -> d
f -> g

,所以如果我们需要找到 ab 之间的路径,我们需要

  1. 使用基于查找最短路径的 LCA 算法在折叠图中查找路径 a - b

  2. 并求循环d - c之间的最短路径

我希望已经足够清楚,这里是实现