图中边顶点之间的最短路径,不应是边本身
Shortest path between vertices of an edge in a graph which should not be the edge itself
我需要在加权无向图中找到每条边的最短替代路径,即假设我在图中有一个egde(a,b),那么我想计算vetices a和b跳过直接路径的最短路径,即edge(a,b)。如果没有替代路径,那么距离应该是无限的。我会为图形的每个边缘执行此操作。我尝试过使用 dijkstras 算法(遇到目标顶点时会中断),但为每个边单独计算路径需要太多时间,尤其是在不可能替代路径的情况下(在这种情况下,必须遍历整个图形)。您能否为此提出任何其他替代解决方案。
我想我要做的是调整 Dijkstra 的算法,以便我最初使用长度为 2 的所有不使用该边缘的路径填充堆/优先级队列(感谢 titus 抓住我之前的错误)。这样,您获得的结果将排除仅包含一个边的路径。然后,结果会为您提供一个特定来源的所有内容,您可以在所有可能的源上重复此操作。
前段时间写的一个dijkstra实现,它使用stl make_heap更有效地找到下一个节点。实现很可能是正确的。
编辑:在从文件读取的示例中,n
是顶点数,m
是边数,a
和b
是边顶点,方向是从a
到b
,c
是权重。
正如 Nobody 提到的,您应该删除边缘,然后将其添加回来,以保持算法不变。
Dennis Meng
提出的解决方案是我想的。但是有一些优化(预处理)可以使您的实现更快。
- 将
图形隔离在一组连接的组件(树)中 [提示:使用 DFS 查找连接的组件]。-- 这样,如果在具有节点
u
的tree
中找不到该对 (u,v) 的最短路径,那么您可以脱离(内部)循环。维护每个节点与其对应的树之间的映射。-- 这将有助于实施步骤 1
对其执行 dijkstras 之前从图形中删除目标边缘.....
- 内存效率表示最短路径的方法?
- 用于查找网格中最短路径的算法
- 查找最短路径算法
- BFS 打印最短路径
- 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- 使用C++具有两个数字的最短路径算法.(C++)
- 使用迭代深度优先搜索算法的未加权图的最短路径
- 如何仅在 2 个节点之间获取最短路径,给定邻接列表有向图?
- 如何使用贝尔曼-福特算法返回所有具有捆绑重量的最短路径?
- 使用优先级队列查找所有与 Dijkstra 相同的最短路径
- 尝试在图形中查找最短路径时的无限循环
- C++计算有向图中的最短路径
- 使用BFS存储和打印最短路径
- 如何制作由原始图形的最短路径边组成的新图形
- 如何在BGL图中找到两个顶点之间的最短路径
- 图中边顶点之间的最短路径,不应是边本身
- Boost:: Dijkstra 最短路径,如何从路径迭代器获取顶点索引
- 如何找到图中两个顶点之间的最短路径
- 如何记录从源顶点到目标顶点的所有最短路径
- 如何打印图中两个顶点之间的最短路径?