위상 정렬
유향 그래프의 정점을 탐색 가능한 순서로 정렬하는 알고리즘이다.
- 유입 간선이 없는 정점들을 찾아 정렬된 리스트에 추가한다.
- 유입 간선이 없으므로 바로 탐색해도 무방한 정점들이다.
- 해당 정점들의 유출 간선들을 제거한다.
- 앞선 정점들을 방문한 상황에서는, 해당 간선들이 그 다음 탐색에 영향주지 않는다.
- 모든 정점을 정렬할 때 까지 1과 2를 반복한다.
- 불가하다면 그래프에 사이클이 존재하는 것이다.
[구현 예시]
from collections import defaultdict, deque
indegree = defaultdict(int)
for v, neighbors in G.items():
for neighbor in neighbors:
indegree[neighbor] += 1
Q = deque()
for v in G.keys():
if indegree[v] == 0:
Q.append(v)
result = []
while Q:
v = Q.popleft()
result.append(v)
for neighbor in G[v]:
indegree[neighbor] -= 1
if indegree[neighbor] == 0:
Q.append(neighbor)