优化搜索具有 N 个顶点和 N 条边的图中的所有最短路径
Optimizing search of all the shortest paths in a Graph with N vertices and N edges
我需要找到图中所有对之间的最短路径 G
。我正在使用 Floyd–Warshall 算法来计算解决方案。
我想知道是否有更好的选择来找到所有关于 G
的最短路径:
G
是一个无向图。
- 顶点数和边数相同
- 所有的边权重都是正的。
鉴于这些事实,是否有比 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
,所以如果我们需要找到 a
和 b
之间的路径,我们需要
使用基于查找最短路径的 LCA 算法在折叠图中查找路径 a - b
。
并求循环d - c
之间的最短路径
我希望已经足够清楚,这里是实现
我需要找到图中所有对之间的最短路径 G
。我正在使用 Floyd–Warshall 算法来计算解决方案。
我想知道是否有更好的选择来找到所有关于 G
的最短路径:
G
是一个无向图。- 顶点数和边数相同
- 所有的边权重都是正的。
鉴于这些事实,是否有比 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
,所以如果我们需要找到 a
和 b
之间的路径,我们需要
使用基于查找最短路径的 LCA 算法在折叠图中查找路径
a - b
。并求循环
d - c
之间的最短路径
我希望已经足够清楚,这里是实现