【问题标题】:Shortest path between vertices of an edge in a graph which should not be the edge itself图中边的顶点之间的最短路径不应该是边本身
【发布时间】:2012-08-09 17:06:22
【问题描述】:

我需要在加权无向图中找到每条边的最短替代路径,即假设我在图中有一个 egde (a,b),那么我想计算顶点 a 和 b 之间的最短路径跳过直接路径,即 edge(a,b) 。如果没有替代路径,那么距离应该是无限的。我想对图的每条边都这样做。我尝试过使用 dijkstras 算法(遇到目标顶点时会中断),但是为每条边单独计算路径需要太多时间,特别是在没有替代方案的情况下路径是可能的(在这种情况下,必须遍历整个图)。您能否为此提出任何其他替代解决方案。

【问题讨论】:

  • 为什么不简单地从图中删除“不允许”的边,然后运行 ​​Dijkstra 或任何其他“正常”的寻路算法?
  • 如果 Dijkstras 花费了太多时间,那么我认为你不走运。不要认为目前已知有更好的算法。
  • 在查找下一个要升级的节点时,您的 dijkstra 实现是否使用最小堆?还是你只是遍历所有的验证?
  • 显然它被称为替换路径问题:cstheory.stackexchange.com/questions/6822/… 更具体地说,它是单边替换路径。 google.com/…

标签: c++ c algorithm graph


【解决方案1】:

我想我要做的是调整 Dijkstra 的算法,以便我最初用长度为 2 且不使用该边的所有路径填充堆/优先队列(感谢titus 发现我之前的错误)。这样,您获得的结果将排除恰好包含一条边的路径。然后,结果会为您提供一个特定来源的所有内容,您可以对所有可能的来源重复此操作。

【讨论】:

  • 我认为您最终可能会得到 a->c->b 的结果,其中 a->c 实际上是 a->b->c。不?在添加所有长度为 2 的路径时,您仍然需要注意不要使用 a->b
  • 啊,真的。 (实际上我最初误读了这个问题,但我认为我们只要检查一下就可以了)
【解决方案2】:

Here 是我前段时间写的一个dijkstra 实现,它使用stl make_heap 更有效地查找下一个节点。实现很可能是正确的。
编辑:在从文件读取的示例中,n 是顶点数,m 是边数,ab是边的顶点,方向是从abc是权重。
正如Nobody 提到的,您应该删除边缘,然后将其添加回来,以保持算法不变。

【讨论】:

    【解决方案3】:

    Dennis Meng 建议的解决方案是我的想法。但是有一些优化(预处理)可以使您的实现更快。

    1. 在一组连通组件(树)中分离图形[提示:使用 DFS 查找连通组件]。 -- 这样,如果你在tree 中没有找到节点u 中对(u,v) 的最短路径,那么你可以跳出(内部)循环。

    2. 维护每个节点与其对应的树之间的映射。 -- 这将有助于实施步骤 1

    【讨论】:

      【解决方案4】:

      在对它执行 dijkstras 之前,您只需简单地从图中删除目标边.....

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-19
        • 2015-04-05
        • 1970-01-01
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-26
        相关资源
        最近更新 更多