我需要找到加权无向图中每条边的最短替代路径,即假设我在图中有一个egde(a,b),然后我想计算vetices a和b之间的最短路径跳过直接路径,即边缘(a,b)。如果没有替代路径,那么距离应该是无限的。我会为图的每个边缘做这个。我尝试使用dijkstras算法(当遇到目标顶点时会破坏)但是每个边缘单独计算路径需要花费太多时间,特别是在无法替代的情况下路径是可能的(在这种情况下,必须遍历整个图形)。你能否为此提出任何其他替代解决方案。
答案 0 :(得分:1)
我想我要做的是调整Dijkstra的算法,这样我最初使用长度为2的所有不使用该边缘的路径填充堆/ priorityqueue(感谢titus捕获我之前的错误)。这样,您获得的结果将排除仅包含一条边的路径。然后,结果将为您提供一个特定来源的所有内容,您可以在所有可能的来源上重复此操作。
答案 1 :(得分:-1)
Here是我前段时间写的一个dijkstra实现,它使用stl make_heap来更有效地找到下一个节点。实施很可能是正确的
在示例中,从文件中读取编辑时,n
是顶点数,m
是边数,a
和b
是边缘顶点,方向从a
到b
,c
是权重。
如上所述Nobody,您应该删除边缘,然后将其添加回来,以保持算法不变。
答案 2 :(得分:-1)
Dennis Meng
建议的解决方案是我的想法。但是有一些优化(预处理)可以使您的实现更快。
在连接组件(树)集中隔离图形[提示:使用DFS查找连接的组件]。
- 这样,如果在tree
有节点u
的情况下找不到对(u,v)的最短路径,那么就可以突破(内部)循环。
维护每个节点与其对应的树之间的映射。 - 这将有助于实施步骤1
答案 3 :(得分:-1)
在执行dijkstras之前,您只需从图表中删除目标边缘即可.......