- 진입차수가 0인 정점을 큐에 삽입.
- 큐에서 빼낸 뒤, 연결된 간선을 모두 제거 -> 진입차수 갱신
- 진입차수가 0이 된 '정점들'을 큐에 삽입.
- 2, 3을 반복
- 모든 정점을 방문하기 전에 큐가 빈다면, 사이클이 발생한 것임. 사이클에 포함된 원소 중에서 어떠한 원소도 큐에 들어가지 못한다.
- 위상정렬은 DAG(순환하지 않는 방향 그래프)에만 적용 가능.
- 위상 정렬에서는 여러 가지 답이 존재할 수 있다. 한 단계에서 큐에 새롭게 들어가는 원소가 2개 이상인 경우가 있다면 여러 가지 답이 존재한다.
- 스택을 활용한 DFS를 이용해 위상 정렬을 수행할 수도 있다
구현
from collections import deque
v, e = map(int, input().split())
indegree = [0] * (v + 1)
graph = [[] for i in range(v + 1)]
for _ in range(e):
a, b = map(int, input().split())
graph[a].append(b)
indegree[b] += 1
def topology_sort():
result = []
q = deque()
for i in range(1, v + 1):
if indegree[i] == 0:
q.append(i)
while q:
now = q.popleft()
result.append(now)
for i in graph[now]:
indegree[i] -= 1
if indegree[i] == 0:
q.append(i)
for i in result:
print(i, end=' ')
topology_sort()
출처 : https://freedeveloper.tistory.com/390