진입차수가 0인 모든 노드를 큐에 넣는다.
큐가 빌 때까지 다음의 과정을 반복한다.
1. 큐에서 원소를 꺼내 해당 노드에서 나가는 간선을 그래프에서 제거한다.
2. 새롭게 진입차수가 0이 된 노드를 큐에 넣는다.
⇒ 결과적으로 **각 노드가 큐에 들어온 순서 == 위상 정렬을 수행한 결과**
가 된다!
# 위상 정렬 알고리즘
from collections import deque
# 입력 및 초기화
num_node, num_edge = map(int, input().split())
indegree = [0] * (num_node + 1) # 각 노드의 진입 차수
graph = [[] for i in range(num_node + 1)] # 각 노드의 간선 연결 정보 (graph[a][b] : a->b 연결)
for _ in range(num_edge):
a, b = map(int, input().split())
graph[a].append(b) # a->b 연결
indegree[b] += 1
# 위상 정렬 함수
def topology_sort():
result = [] # 알고리즘 수행 결과
q = deque()
# 큐 초기화 : 진입 차수가 0인 노드
for i in range(1, num_node + 1):
if indegree[i] == 0:
q.append(i)
# q가 빌 때까지
while q:
now = q.popleft() # 큐에서 꺼낸 노드
result.append(now)
# now에서 나오는 간선 제거
for i in graph[now]:
indegree[i] -= 1
# 진입차수가 0이 됐다면 큐에 삽입
if indegree[i] == 0:
q.append(i)
# 결과 출력
for node in result:
print(node, end=' ')
topology_sort()
'''
입력
7 8
1 2
1 5
2 3
2 6
3 4
4 7
5 6
6 4
'''
'''
출력
1 2 5 3 6 4 7
'''
O(V+E)
len(result) == num_node
가 성립하면, 위상 정렬이 가능하고 그렇지 않다면 불가능하다.# 음악 프로그램
from collections import deque
import sys
input = sys.stdin.readline
# 입력 및 초기화
num_node, m = map(int, input().split())
indegree = [0] * (num_node + 1) # 각 노드의 진입 차수
graph = [[] for i in range(num_node + 1)] # 각 노드의 간선 연결 정보 (graph[a][b] : a->b 연결)
# 보조 pd의 정보를 바탕으로 그래프 입력
for _ in range(m):
order = list(map(int, input().split()))
for i in range(1, order[0]):
graph[order[i]].append(order[i + 1])
indegree[order[i + 1]] += 1
result = [] # 알고리즘 수행 결과
q = deque()
# 큐 초기화 : 진입 차수가 0인 노드
for i in range(1, num_node + 1):
if indegree[i] == 0:
q.append(i)
# q가 빌 때까지
while q:
now = q.popleft() # 큐에서 꺼낸 노드
result.append(now)
# now에서 나오는 간선 제거
for i in graph[now]:
indegree[i] -= 1
# 진입차수가 0이 됐다면 큐에 삽입
if indegree[i] == 0:
q.append(i)
# 출력
# 위상 정렬이 가능한지 확인
if len(result) == num_node:
for node in result:
print(node)
else:
print(0)