algorithm - 查找覆盖两个节点之间所有边的路径

标签 algorithm graph path-finding edges

我们希望您能帮助我们解决以下问题:

给出一个可能包含环的有向图。必须找到一组满足以下条件的路径:

在从节点 A 到节点 B 的途中可以通过的所有边都必须被集合内的路径覆盖(一条边可以是集合中多条路径的一部分)

解决方案不一定是路径数量最少的解决方案,路径也不一定是最短的。但是,该解决方案应该可以使用编程语言(如 java)有效地实现。我们需要生成一些测试用例的解决方案,覆盖节点 A 和节点 B 之间的所有边很重要。

大家都知道合适的算法吗?还是不存在有效的解决方案?

非常感谢您的建议! (我们已经在寻找解决方案,但我们找到的解决方案专注于最短路径并且效率极低)

这是我们问题的图形表示:

http://i.stack.imgur.com/wIY34.jpg

最佳答案

考虑从 A 可达的所有边 R(A)。可以通过在每条边上添加一个节点(即将每条边 U->V 变为 U->X->V)然后执行广度优先搜索来找到它们从 A 开始。

R(A) 之外的边显然不能在从 AB 的路径上,因为那样它们就可以到达来自 A。所以到 B 的所有路径都必须经过 R(A) 的边。

因此我们要“覆盖”的边集 UR(A) 的所有边,B 是可达的来自。

现在我们正在寻找一组从 A 到 B 的路径 S,其中包含 U 的所有边。

一个简单的方法如下:

  • R(A) 的所有边着色为黑色并设置 S={ }
  • 虽然还有黑边:
    • 拍摄黑边 UV。
    • 如果 B 可以从 V 到达:
      • 构建路径P = A -> ... -> U -> V -> ... -> B
      • P的所有边都涂成灰色
      • P添加到S
    • 其他:
      • 将 UV 着色为灰色。
  • 然后返回S

正如@user189 所指出的,如果我们考虑从 A 到 B 的可达边,我们允许路径两次通过 B。(即 a->b->c->g->f->e示例图像)。 他建议的解决方案(在计算 R(A) 之前删除节点 B)解决了这个问题。

关于复杂性:

R(A) 可以在 O(|E|) 时间内计算,并且从 A 到边 的路径R(A)中的UV可以直接从BFS树中读取。要检查从 VB 的可达性并找到路径,我们可以使用 BFS 树从 B 开始并向后跟随边缘,在 O(| E|) 时间。

如果我们通过连接两个 BFS 树的边 UV 隐式引用路径,并使用 O(1) 读取/更新结构来维护黑色边集并在 BFS 树中查找边,我认为我们可以在 O(|E|) 时间内完成。

关于algorithm - 查找覆盖两个节点之间所有边的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23773590/

相关文章:

algorithm - 使用 HashMap 构建图形?

javascript - 如何创建移动图表折线图js的背景?

python - scikit-learn ExtraTreeClassifier 和 RandomForestClassifier 的图

python - 来自同一个 python 程序的多个 GUI 屏幕

path-finding - 如何处理A *寻路中的障碍以达到 'next best'目标?

algorithm - 从 Vec<String> 构建 UrlTree

java - 用于在有向图中查找从节点到根的路径的高性能图算法

java - A* 欧氏距离启发式计算

javascript - 获取模 10 序列的第 n 个元素

graph - 具有双向边的图上的 Ford-Fulkerson 算法