我编写的代码用于使用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;
}
答案 0 :(得分:1)
您的算法至少存在两个问题:
isCyclicDirected
只检测图表中是否有任何循环。您无法直接使用它来计算周期。例如,您的算法将计算(A B)(B A)(C A)中的两个周期,因为(C A)连接到受访节点。
如果要在示例中检测两个周期,则检测需要基于边缘而不是基于顶点。 (B E)形成一个循环,但B和E都标记为从先前的运行中访问过。