Algorithm (PS)

[백준] 2252 줄세우기 in python + 위상정렬(topology_sort)

minjiwoo 2022. 3. 8. 09:37
728x90

위상 정렬만 알면 날먹 가능한 문제이다

https://www.acmicpc.net/problem/2252

학생들을 줄 세워야 하는데 우선순위의 일부분이 m개 주어진다

이를 위상정렬 그래프로 생각하면 반드시 정점 a(학생1) 을 먼저 방문한 이후,  정점 b(학생2) 를 방문해야 한다 라는 순서가 된다. 

위상정렬에서는 정점 b를 가기 위해서는 반드시 정점 a를 지나쳐야 하므로, 진입차수(indegree)가 1 증가하게 된다. 

# 위상 정렬

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()
728x90