문제
백준 2252번 - 줄 세우기
해결 과정
- 위상 정렬
- 예시) 3명의 학생 중에서 키를 2번 비교
1번이 3번보다 작고(1 -> 3), 2번이 3보다 작다 (2 -> 3)
진입차수 indegree = [0, 0, 0, 2]
그래프 student = [[], [3], [3], []]
- 위상정렬의 과정은 다음과 같다.
- 진입차수가 0인 정점을 큐에 삽입
- for문을 1부터 n까지 돌면서 진입차수가 0인 것을 큐에 삽입
- 큐에서 원소를 꺼내 해당 원소와 연결된 간선을 모두 제거
- 큐가 빌 때까지 반복문을 돌기
- 현재 원소를 큐에서 빼고 result에 넣고
- 현재 원소에 연결된 노드를 반복문 돌면서 연결된 간선에서 1 빼기
- 제거한 후에 진입차수가 0인 정점을 큐에 삽입
- 이후 2~3의 과정을 반복
풀이
import sys
from collections import deque
n,m = map(int,sys.stdin.readline().split())
indegree = [0] * (n+1)
student = [[] for _ in range(n+1)]
for _ in range(m):
a, b = map(int,sys.stdin.readline().split())
student[a].append(b)
indegree[b] += 1
def topology_sort():
result = []
q = deque()
for i in range(1, n+1):
if indegree[i] == 0:
q.append(i)
while q:
now = q.popleft()
result.append(now)
for i in student[now]:
indegree[i] -= 1
if indegree[i] == 0:
q.append(i)
for i in result:
print(i, end=" ")
topology_sort()