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

时间:2012-08-09 17:06:22

标签: c++ c algorithm graph

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

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

答案 2 :(得分:-1)

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

  1. 在连接组件(树)集中隔离图形[提示:使用DFS查找连接的组件]。 - 这样,如果在tree有节点u的情况下找不到对(u,v)的最短路径,那么就可以突破(内部)循环。

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

答案 3 :(得分:-1)

在执行dijkstras之前,您只需从图表中删除目标边缘即可.......