아래 코드는 유향 그래프에주기가 있는지 여부를 확인하기 위해 깊이 우선 검색 DFS를 구현 한 것입니다. 그러나 작동하지 않으므로 버그가있는 것으로 보입니다. 나는 버그가 if (visited[w])
상태에 있다는 것을 거의 100 % 확신합니다. 여기에 내 논리는 기본적으로 - 노드가 이미 방문한 경우 사이클이 존재합니다. 그러나 if (visited[w])
의 문제점은 조건이 true 일지라도 노드가 오래 전에 방문되었을 수 있으므로 반드시주기가 있음을 의미하지는 않습니다.그래프에 재귀 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()'당신에게 제공하는 메모리를 초기화하지 않습니다, 당신은 스스로를 초기화하지 않습니다. 그 안에 무엇이 들어 있는지 누가 압니까? 모두 0으로 시작하기를 원한다면 가장 쉬운 해결책은'malloc() '대신'calloc()'을 사용하여 할당하는 것입니다. –
@JohnBollinger for 루프 (위에 표시되지 않음)를 사용하여 0으로 모든 것을 초기화했지만 분명히 문제가되지는 않습니다. – novice
또한 노드 0에서 시작하는 DFS를 수행하지만 그래프가 연결되어 있지 않으면 순환을 놓칠 수 있습니다. 해당 노드에서 도달 할 수 없습니다. –