下面的代碼是深度優先的搜索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,但如果圖形未連接,則可能會錯過一個循環無法從該節點訪問。 –