위상 정렬 : 순서가 정해져있는 작업을 차례로 수행해야 할 때 그 순서를 결정하기 위해 사용하는 알고리즘
ex) 대학 선수 과목
위상 정렬은 시작점이 존재 해야 하는 데, 사이클 그래프에서는 시작점부터 찾을 수가 없다. 따라서 순서를 정할 수 없기 때문에 사이클이 존재하는 경우는 위상 정렬을 수행할 수 없음
-> 즉, 항상 진입차수가 0인 정점을 큐에 넣는 과정 만으로 위상 정렬을 수행할 수 있음
from collections import deque
v, e = map(int, input().split())
indegree = [0] * (v + 1)
graph = [[] for _ 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()
O(V + E) : 정점의 개수 + 간선의 개수
https://www.acmicpc.net/problem/2252