728x90
https://www.acmicpc.net/problem/2252
2252번: 줄 세우기
첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의
www.acmicpc.net
2023.04.11 - [코딩 테스트/개념] - Topological sort
# 1 <= N <= 32000
# 1 <= M <= 100000
# no cycle, directed graph
import sys
from collections import deque
readline = sys.stdin.readline
N, M = map(int, readline().split())
graph = [[] for _ in range(N + 1)]
indegree = [0 for _ in range(N + 1)]
for i in range(1, M + 1):
A, B = map(int, readline().split()) # A -> B
graph[A].append(B)
indegree[B] += 1
tp = []
queue = deque()
for i in range(1, N + 1):
if indegree[i] == 0:
queue.append(i)
while len(tp) < N and queue:
v = queue.popleft()
tp.append(v)
for adj_v in graph[v]:
indegree[adj_v] -= 1
if indegree[adj_v] == 0:
queue.append(adj_v)
print(" ".join(map(str, tp)))
진입 차수(in-degree)가 0인 노드를 골라서 위상 정렬 배열에 추가하고, 해당 노드와 연결된 인접 노드들을 인접 리스트를 통해 찾고 진입 차수를 1씩 감소시키는 방식으로 정렬이 이뤄진다.
다만, 진입 차수가 0인 노드를 고를 때 while문 안에서 반복문으로 찾으면 시간 초과가 발생한다. 따라서 queue를 이용해 0인 노드들을 저장하고 꺼내서 사용하는 방식으로 수정했다.
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준 9663번] N-Queen (2) | 2023.04.15 |
---|---|
[백준 1916번] 최소 비용 구하기 (0) | 2023.04.15 |
[백준 1976번] 여행 가자 (0) | 2023.04.15 |
[백준 1717번] 집합의 표현 (0) | 2023.04.14 |
[백준 2193번] 이친수 (0) | 2023.04.14 |