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

时间:2013-11-26 20:52:49

标签: 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;
    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;
}

1 个答案:

答案 0 :(得分:1)

您的算法至少存在两个问题:

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

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