▶ 문제 : https://www.acmicpc.net/problem/2252
▶ (참조)위상 정렬 : https://blog.naver.com/ndb796/221236874984
▶ (참조)deque 사용법 : https://dongdongfather.tistory.com/72
▶ 코드
# 위상 정렬 - 사이클이 없어야 가능하다.
# 단계1) 진입차수가 0인 정점들을 큐에 삽입한다.
# 단계2) 큐에서 원소를 꺼내 연결된 모든 간선을 제거한다.
# 단계3) 간선 제거 이후에 진입차수가 0 이 된 정점을 큐에 삽입한다.
# 큐가 빌 때까지 단계2~3을 반복한다.
# 모든 원소를 방문하기전에 큐가 빈다면 사이클이 존재하는것이다.
from collections import deque
import sys
n, m = map(int, sys.stdin.readline().split())
dq = deque()
indegree = [0]*(n+1) # 진입차수 (노드 : 1~N)
tree = [[] for i in range(n+1)] # 트리 구조 (노드 : 1~N)
result = []
for _ in range(m):
a, b = map(int, sys.stdin.readline().split())
tree[a].append(b)
indegree[b] += 1
#print('tree=', tree)
#print('indegree=', indegree)
# 단계1
for i in range(1,n+1):
if indegree[i] == 0:
dq.appendleft(i)
#print('dq=', dq)
# 큐가 빌 때까지 단계2 ~ 3 을 반복
while dq:
a = dq.pop() # 단계2
result.append(a)
for b in tree[a]:
indegree[b] -= 1
if indegree[b] == 0: # 단계3
dq.appendleft(b)
#print('result=', result)
for a in result:
print(a, end=' ')