下面的代码是深度优先的搜索DFS的实现,以确定有向图是否有循环或不循环。但是,它似乎有一个错误,因为它不工作。我几乎100%肯定该错误在于if (visited[w])
的条件。我的逻辑基本上是 - 如果一个节点已经被访问过,那么就存在一个循环。然而,if (visited[w])
的问题在于,尽管条件可能是真实的,但并不一定意味着存在周期,因为该节点可能早已被访问过。如何查找图形是否包含使用递归DFS的循环?
int *visited; // array [0..V-1] of booleans
int checkCycle(Graph g)
{
visited = malloc(sizeof(int)*g->numVertices);
int result = dfsCycleCheck(g, 0);
free(visited);
return result;
}
int dfsCycleCheck(Graph g, Vertex v)
{
visited[v] = 1;
Vertex w;
for (w = 0; w < nV(g); w++) {
if (!hasEdge(g,v,w)) continue;
if (visited[w]) return 1; // found cycle
return dfsCycleCheck(g, w);
}
return 0; // no cycle
}
'的malloc()'不初始化它提供给你的内存,你不自己初始化。谁知道它里面有什么?如果你希望它以全零开始,那么最简单的解决方案是使用'calloc()'而不是'malloc()'进行分配。 –
@JohnBollinger我使用for循环(以上未显示)将所有内容初始化为0,但这显然不是问题 – novice
另外,您从节点0开始执行DFS,但如果图形未连接,则可能会错过一个循环无法从该节点访问。 –