Cycle Detection: 그래프 사이클 탐지
Cycle Detection, 사이클 탐지, cycle finding
정의
그래프에 사이클이 존재하는가, 또는 어느 사이클인가 를 찾는 문제.
무향 그래프
Union-Find 접근
간선 (u, v) 삽입 시 find(u) == find(v) 이면 사이클.
DSU dsu(n);
for (auto [u, v] : edges) {
if (dsu.same(u, v)) { /* 사이클! */ }
else dsu.merge(u, v);
}
DFS 접근
부모가 아닌 방문 완료 정점으로 되돌아가면 사이클.
유향 그래프
DFS + 3 색
- 흰색: 미방문
- 회색: DFS 스택 위
- 검은색: 완료 회색 정점으로 가는 간선 = back edge = 사이클.
vector<int> color; // 0/1/2
bool dfs(int u, vector<vector<int>>& adj) {
color[u] = 1;
for (int v : adj[u]) {
if (color[v] == 1) return true; // back edge
if (color[v] == 0 && dfs(v, adj)) return true;
}
color[u] = 2;
return false;
}
Kahn’s 활용
위상 정렬 로 얻은 순서 크기 < N 이면 사이클 존재.
참고
- Topological Sorting
- Union-Find
- Tarjan SCC (강한 연결 요소)
이 글의 용어 (3개)
- 분리 집합 (Disjoint Set, Union-Find)algorithm
- 정의 분리 집합 (Disjoint Set, Union-Find) 은 서로 겹치지 않는 집합들을 관리하며, 다음 두 연산을 거의 상수 시간 (amortized O(α(N)), α는…
- 위상 정렬 (Topological Sorting)algorithm
- 정의 위상 정렬 (Topological Sorting) 은 방향 비순환 그래프 (DAG) 의 모든 정점을 간선 방향을 어기지 않도록 일렬로 나열하는 것. 간선 가 있으면 정렬 결…
- Tarjan SCC: 강한 연결 요소 O(V+E)algorithm
- 정의 Strongly Connected Component (SCC) 는 유향 그래프에서 서로 도달 가능한 정점들의 극대 집합입니다. Tarjan's algorithm 은 단일 D…
💬 댓글