【问题标题】:Optimizing search of all the shortest paths in a Graph with N vertices and N edges在具有 N 个顶点和 N 个边的图中优化所有最短路径的搜索
【发布时间】:2015-10-02 13:50:00
【问题描述】:

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

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

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

鉴于这些事实,还有比 Floyd-Warshall 更好的解决方案吗?

【问题讨论】:

  • The numbers of vertices and the edges is the same - 这是否意味着图非常稀疏?
  • 我不知道那是什么意思。 (我没有太多图论背景)
  • 这正是我的意思
  • 我会说 #2 意味着该图有一个循环和 0 个或多个“尾巴”。在这种情况下,击败 Floyd-Warshall 应该相当容易。
  • 图是否连通?

标签: algorithm tree graph-theory shortest-path


【解决方案1】:

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

可能您的图具有特殊的拓扑结构,可以使用更有效的方法...

C++ code with Russian description(可能被谷歌浏览器翻译)

我有网格图here的delphi实现。

【讨论】:

  • 图表代表路线,据我所知,除了我列出的功能之外,没有任何特别之处。
  • 好的,我为路线图做了那个实现。
【解决方案2】:

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

【讨论】:

  • 是的,但测试表明 Floyd-Warshall 的效率要高得多
  • 但是由于我在算法方面没有广泛的背景,但约翰逊的核心基本上是在每一对上执行 Dijkstra 算法?对吗?
【解决方案3】:

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

由于有N 顶点和N 边并且图是连通的,我们知道只有一个循环,因此可以以某种方式“压缩”该循环并保存该循环的“满足”与图表的其余部分。

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

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

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

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

  2. 并在循环中找到d - c之间的最短路径

我希望已经足够清楚了,实现就在这里

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2012-05-14
    • 2014-12-11
    相关资源
    最近更新 更多