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

时间:2014-05-21 03:45:24

标签: algorithm graph path-finding edges

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

给出了可能包含循环的有向图。必须找到一组符合以下标准的路径:

所有可以在从节点A到节点B的路上传递的边必须被集合中的路径覆盖(一个边可以是来自集合的多个路径的一部分)

解决方案不一定是具有最少路径数的解决方案,并且路径不一定必须是最短路径。但是,解决方案应该像java一样使用编程语言高效实现。我们需要解决方案来生成一些测试用例,覆盖节点A和节点B之间的所有边缘非常重要。

每个人都知道合适的算法吗?或者没有有效的解决方案?

提前感谢您的建议! (我们已经搜索过一个解决方案,但我们发现的解决方案主要集中在最短的路径上并且效率极低)

以下是我们问题的图形表示:

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

1 个答案:

答案 0 :(得分:0)

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

R(A)之外的边缘显然不能位于从 A B 的路径上,从那以后他们就可以了可以从 A 访问。因此,B的所有路径必须经过 R(A)的边缘。

所以边缘集合 U ,我们希望"覆盖"是 R(A)的所有边缘,可以从 B 到达。

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

一种简单的方法如下:

  • R(A)黑色的所有边缘着色并设置 S = {}
  • 虽然还有黑边:
    • 采取黑边UV。
    • 如果 B 可以从 V 访问:
      • 构建路径 P = A - > ... - > U - > V - > ... - >乙
      • 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树中读取。要从 V 检查 B 的可达性并找到路径,我们可以使用从B开始的BFS树和向后的边,在 O中计算(| E |)时间。

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