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

풀이
위상정렬 알고리즘은 다음과 같다.
https://sunghyun98.tistory.com/249
[알고리즘] 위상 정렬
위상 정렬은 방향 그래프의 모든 노드를 방향성을 거스르지 않게 순서대로 나열하는 것입니다. 즉, 어떤 작업을 먼저 해야 다른 작업을 할 수 있는 상황과 같은 "의존성"을 갖는 문제를 표현하고
sunghyun98.tistory.com
코드
# 2252번 줄 세우기
import sys
from collections import deque
n, m = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(n+1)]
numOfEdges = [0 for _ in range(n+1)]
queue = deque()
answer = []
for i in range(m):
a, b = map(int, sys.stdin.readline().rstrip().split())
graph[a].append(b)
numOfEdges[b] += 1
# 위상정렬 큐에 집어넣기 위해서 진입 간선이 0개인 노드를 고른다.
for i in range(1, n+1):
if numOfEdges[i] == 0:
queue.append(i)
while queue:
c_n = queue.popleft()
answer.append(c_n)
# 진출 차선에 연결된 노드 추출.
for i in graph[c_n]:
numOfEdges[i] -= 1
if numOfEdges[i] == 0:
queue.append(i)
print(*answer)
출력결과

'백준 > 위상 정렬' 카테고리의 다른 글
[백준][Python] 2056번 작업 - 코팩 (0) | 2023.09.14 |
---|---|
[백준][Python] 2623번 음악프로그램 - 코팩 (0) | 2023.09.12 |
[백준][Python] 1516번 게임개발 - 코팩 (0) | 2023.09.11 |
[백준][Python] 1005번 ACM Craft - 코팩 (0) | 2023.08.11 |
[백준][Python] 1766번 문제집 - 코팩 (0) | 2023.08.10 |
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

풀이
위상정렬 알고리즘은 다음과 같다.
https://sunghyun98.tistory.com/249
[알고리즘] 위상 정렬
위상 정렬은 방향 그래프의 모든 노드를 방향성을 거스르지 않게 순서대로 나열하는 것입니다. 즉, 어떤 작업을 먼저 해야 다른 작업을 할 수 있는 상황과 같은 "의존성"을 갖는 문제를 표현하고
sunghyun98.tistory.com
코드
# 2252번 줄 세우기
import sys
from collections import deque
n, m = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(n+1)]
numOfEdges = [0 for _ in range(n+1)]
queue = deque()
answer = []
for i in range(m):
a, b = map(int, sys.stdin.readline().rstrip().split())
graph[a].append(b)
numOfEdges[b] += 1
# 위상정렬 큐에 집어넣기 위해서 진입 간선이 0개인 노드를 고른다.
for i in range(1, n+1):
if numOfEdges[i] == 0:
queue.append(i)
while queue:
c_n = queue.popleft()
answer.append(c_n)
# 진출 차선에 연결된 노드 추출.
for i in graph[c_n]:
numOfEdges[i] -= 1
if numOfEdges[i] == 0:
queue.append(i)
print(*answer)
출력결과

'백준 > 위상 정렬' 카테고리의 다른 글
[백준][Python] 2056번 작업 - 코팩 (0) | 2023.09.14 |
---|---|
[백준][Python] 2623번 음악프로그램 - 코팩 (0) | 2023.09.12 |
[백준][Python] 1516번 게임개발 - 코팩 (0) | 2023.09.11 |
[백준][Python] 1005번 ACM Craft - 코팩 (0) | 2023.08.11 |
[백준][Python] 1766번 문제집 - 코팩 (0) | 2023.08.10 |