图中边顶点之间的最短路径,不应是边本身

Shortest path between vertices of an edge in a graph which should not be the edge itself

本文关键字:最短路径 顶点 之间      更新时间:2023-10-16

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

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

这是我

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

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

  1. 图形隔离在一组连接的组件(树)中 [提示:使用 DFS 查找连接的组件]。-- 这样,如果在具有节点utree中找不到该对 (u,v) 的最短路径,那么您可以脱离(内部)循环。

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

您只需在

对其执行 dijkstras 之前从图形中删除目标边缘.....