我们希望您能够帮助我们解决以下问题:
给出了可能包含循环的有向图。必须找到一组符合以下标准的路径:
所有可以在从节点A到节点B的路上传递的边必须被集合中的路径覆盖(一个边可以是来自集合的多个路径的一部分)
解决方案不一定是具有最少路径数的解决方案,并且路径不一定必须是最短路径。但是,解决方案应该像java一样使用编程语言高效实现。我们需要解决方案来生成一些测试用例,覆盖节点A和节点B之间的所有边缘非常重要。
每个人都知道合适的算法吗?或者没有有效的解决方案?
提前感谢您的建议! (我们已经搜索过一个解决方案,但我们发现的解决方案主要集中在最短的路径上并且效率极低)
以下是我们问题的图形表示:
答案 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的所有边缘。
一种简单的方法如下:
正如@ 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 |)时间内完成此任务。