以下のコードは、有向グラフにサイクルがあるかどうかを判断するために、深さ優先の 検索DFSの実装です。しかし、動作していないので、そこにバグがあるようです。私はそのバグがif (visited[w])
状態にあることをほぼ100%確信しています。ここでの私のロジックは、基本的には - ノードが既に訪問されている場合は、サイクルが存在します。しかし、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()'、それはあなたに提供するメモリを初期化していない、とあなたはそれを自分で初期化されません。それに何が入っているのか誰が知っていますか?それをすべてゼロとして開始したい場合、最も簡単な解決策は 'malloc() 'ではなく' calloc() 'で割り当てることです。 –
@JohnBollinger forループを使用してすべてを0に初期化しましたが(上には表示されていません)、それは明らかに問題ではありません。 – novice
また、ノード0からDFSを開始しますが、グラフが接続されていない場合、そのノードから到達できません。 –