当前位置: 首页 > 知识库问答 >
问题:

找到从源到目标覆盖所有边的所有可能路径集

牛经赋
2023-03-14

我有一个有向图。我想找到从源到目标的所有可能路径,覆盖所有转换。这与“覆盖所有顶点的所有可能路径”不同。该图将正好有一个起始顶点,并且可能有多个结束顶点。如果没有传出转换,则节点是结束节点。集合中的路径可能具有重复的变换,但不能具有重复的顶点。附有一个示例有向图。顶点a(黑色)是起始顶点,顶点e和f是结束节点(黄色)。此图的解决方案如下所示。

a-f
a-b-f
a-b-c-e
a-b-c-d-e
a-b-c-d-b-f

您可以看到最后一条路径有两次b。这是有效的。i、 例如,一条路径可以多次具有相同的顶点。相应的转换为

t18
t1-t7
t1-t2-t3
t1-t2-t4-t5
t1-t2-t4-t6-t7

您可以看到,没有路径具有重复的变换。我需要一个java程序来做到这一点。我写了一个程序来解决这个问题。但它给出了所有没有重复顶点的路径。因此,我丢失了一些边,尽管它覆盖了所有节点。下面给出了我编写的代码

private Stack<Vertex> path = new Stack<Vertex>(); // the current path
private Set<Vertex> onPath = new HashSet<Vertex>(); // the set of vertices
public void AllPaths(Vertex s) {
    enumerate2(s);
}

private void enumerate(Vertex v) {
    // add node v to current path from source
    path.push(v);
    onPath.add(v);
    if (v.getOutgoings().size() == 0) {
        printPath(path);
        addToRawPaths(path);
    }

    // consider all neighbors that would continue path with repeating a node
    else {
        EList<Transition> ts = v.getOutgoings();
        for (Transition w : ts) {
            if (!onPath.contains(w.getTarget())) { // !onPath.contains(w.getTarget())
                enumerate(w.getTarget());
            }
        }
    }

    // done exploring from v, so remove from path
    path.pop();
    onPath.remove(v);
}

使用这个,我可以

a-f
a-b-f
a-b-c-e
a-b-c-d-e

但是我需要像我上面描述的那样的东西。你可以假设我在这段代码中使用的这些api,或者你可以实现新的。甚至psudocode也可以。我需要解决方案来应用于基于模型的测试工具以生成测试用例。非常感谢。

共有1个答案

慕容嘉荣
2023-03-14

当前,当您找到已包含在onPath中的顶点时,将停止枚举。这不应该是你的规则。相反,当当前路径上相继存在currentVertex、nextCandidateVertex和w.getTarget()对时,应该停止枚举。

为了实现这一点,我将使用HashSet

实际上,您可以使用path堆栈实现相同的功能,但查找现有对可能需要O(n)VS摊销O(1),并使用HashSet的建议方法

 类似资料:
  • 我们希望您能够帮助我们解决以下问题: 给出了一个可能包含圈的有向图。必须找到一组满足以下标准的路径: 在从节点A到节点B的过程中可以通过的所有边必须被集合内的路径覆盖(一条边可以是集合中多条路径的一部分) 解决方案不必是路径数最少的解决方案,路径也不必是最短的。然而,该解决方案应该可以像java一样使用编程语言高效地实现。我们需要解决方案来生成几个测试用例,覆盖节点a和节点B之间的所有边很重要。

  • 我有一个带有邻接矩阵形状的图()。我当前的问题是找到从源()到目标()的路径长度列表(节点顺序并不重要)。 我对寻找路径序列不感兴趣;我只对传播路径长度感兴趣。因此,这不同于找到所有简单的路径——这太慢了(即。找到从源到目标的所有路径;然后给每条路径打分)。有没有一种表演方法可以快速做到这一点? 建议将DFS作为一种可能的策略(此处注明)。我当前的实施(如下)根本不是最优的:

  • 我有以下Java代码,可以在图中找到从一个节点到另一个节点的路径,如何修改它,以便显示所有可能的路径。这里只显示了一条路径,它是一个循环? 输出:路径:[1、2、3、4、1] 对于节点1和4之间的路径,正确的输出应该是: 第一条路径:1- 第二条路径:1- 代码:

  • 我刚刚安装了最新的Android Studio,我得到了标题中的错误;我尝试了互联网上的许多解决方案,但都不起作用。 所以请你帮我修一下好吗? 我收到此错误: 该项目是Android Studio中的基本项目示例。

  • 假设我们有一个已知的最小生成树。 我们的任务是找到存在于每对顶点之间的路径的最大边缘。 举个例子, 我们有以下最小生成树: 在顶点1和2之间,我们有一个成本为10的边。在顶点1和3之间,我们有一个成本为5的边。在顶点3和4之间,我们有一个成本为4的边。 每个路径的最大边缘: 路径1-2:它只包含代价为10的边。所以答案是10。 路径1-3:它只包含代价为5的边缘。所以答案是5。 路径1-4:从顶点

  • 我正在做一个DP课程来复习(这很好,帮了我很多),其中一个问题是