循环检测代码在Java的有向图中未找到返回正确循环数的代码?

循环检测代码在Java的有向图中未找到返回正确循环数的代码?,java,graph,depth-first-search,directed-graph,cyclic-graph,Java,Graph,Depth First Search,Directed Graph,Cyclic Graph,我编写了代码,用于使用DFS计算有向图中的循环数。检查循环是否存在的方法工作正常。现在,我遍历所有顶点(我在HashMap中有这些顶点),检查顶点是否未被访问,然后检查是否存在循环,如果存在循环,则将计数器递增1。现在代码中断,它没有给出正确的循环数,例如:对于具有以下边的图: (A B),(B C),(C E),(E A),(B E) 这是我的密码 public int getTotalCyclesinDir(){ clearAll(); int count=0; f

我编写了代码,用于使用
DFS
计算有向图中的循环数。检查循环是否存在的方法工作正常。现在,我遍历所有顶点(我在HashMap中有这些顶点),检查顶点是否未被访问,然后检查是否存在循环,如果存在循环,则将计数器递增1。现在代码中断,它没有给出正确的循环数,例如:对于具有以下边的图:

(A B),(B C),(C E),(E A),(B E)
这是我的密码

public int getTotalCyclesinDir(){
    clearAll();
    int count=0;
    for (Vertex v : vertexMap.values()) {
        if (!v.isVisited && isCyclicDirected(v))
            count++;
    }
    return count;
}

public boolean isCyclicDirected(Vertex v){
    if (!v.isVisited){
        v.setVisited(true);
        Iterator<Edge> e = v.adj.iterator();
        while (e.hasNext()){
            Vertex t = e.next().target;
            if (!t.isVisited) {
                if (isCyclicDirected(t))
                    return true;
            }
            else return true;
        }
        return false;
    }
    else return true;
}
public int getTotalCyclesinDir(){
clearAll();
整数计数=0;
对于(顶点v:vertexMap.values()){
如果(!v.isvisted&&isCyclicDirected(v))
计数++;
}
返回计数;
}
公共布尔isCyclicDirected(顶点v){
如果(!v.isvistated){
v、 setVisited(真);
迭代器e=v.adj.Iterator();
while(e.hasNext()){
顶点t=e.next().target;
如果(!t.isvis){
如果(isCyclicDirected(t))
返回true;
}
否则返回true;
}
返回false;
}
否则返回true;
}

您的算法至少有两个问题:

  • isCyclicDirected
    只检测图形中是否有任何循环。不能直接使用它来计算周期。例如,您的算法将在(A B)(B A)(C A)中计算两个周期,因为(C A)连接到访问的节点

  • 如果要在示例中检测两个循环,则检测需要基于边,而不是基于顶点。(B E)形成一个循环,但B和E都标记为从以前的运行中访问


您期望哪个数字以及算法返回什么?我期望2,因为有两个循环,但它只返回一个。此外,我发现我的
isCyclicDirected
方法中有太多返回语句。有什么方法可以简化它吗?如果您需要代码的其他部分,我可以在if/else中添加它们,我会首先使用简短的例子,特别是如果这样可以避免出现not。另外,如果您有条件地返回,那么在此之后您实际上不需要显式的else。我明白您的意思。1) 你所说的基于边缘的,你能详细说明一下2)在
isCyclicDirected
方法中,我有太多的回报,这是所有必要的或任何简化的空间..谢谢,假设有一条河,你想数一数桥梁。你从桥的一侧开始,在到访的岸边做标记。然后你过了桥,在桥的另一边做了标记。然后您得出结论,因为您访问了两个方面,所以只有一座桥。我对代码进行了更改,并以不同的方式实现,以跟踪边缘。我仍然有一些问题,我在这里发布了。。