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

时间:2015-07-14 04:54:12

标签: algorithm tree graph-theory shortest-path

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

我需要知道是否有更好的选择来找到关于G这些事实的所有最短路径:

  1. G是无向图。
  2. 顶点数和边数相同。
  3. 所有边缘权重均为正值。
  4. 鉴于这些事实,是否有比Floyd-Warshall更好的解决方案?

3 个答案:

答案 0 :(得分:4)

对稀疏图进行Dijkstra最短路径算法的修改非常快并且显示对数线性(接近线性)渐近行为。你需要从N个顶点进行N次搜索,得到的O(N ^ 2 * LogN)渐近时间优于O(N ^ 3)Floyd-Warshall算法。

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

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

我有网格图here的delphi实现。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

由于N个顶点和N边缘并且图形已连接,我们知道只有一个周期,因此,该周期可以采用“压缩”的方式并保存“满足度” “与图表的其余部分相关的那个循环。

例如,在下一个图表中,我们可以替换周期c-d-e-g并创建一个新节点h并保存所有外部的循环关系

a -> c
b -> d
f -> g

,因此,如果我们需要找到ab之间的路径,我们需要

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

  2. 找到周期中d - c之间的最短路径

  3. enter image description here

    我希望已经足够明确,实施就在这里