1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import sys
input = sys.stdin.readline
from collections import deque
n, m = map(int, input().split())
V = {}
parent = [0 for i in range(n + 1)]
for i in range(1, n + 1) :
V[i] = []
for i in range(m) :
l = list(map(int, input().split()))
for i in range(1, l[0]) :
V[l[i]].append(l[i+1])
parent[l[i+1]] = parent[l[i+1]] + 1
que = deque()
for i in range(1, n + 1) :
if parent[i] == 0 :
que.append(i)
ans = []
while que :
i = que.popleft()
ans.append(i)
for j in V[i] :
parent[j] = parent[j] - 1
if parent[j] == 0 :
que.append(j)
if len(ans) == n :
for i in ans :
print(i)
else :
print(0)
|
cs |
IDEA
인풋받은대로 위상정렬하여 출력하면 되는 정석적인 문제이지만, 불가능한 경우 0을 출력해야 한다.
위상정렬 BFS는 정석적으로 구현하되, 답을 ans로 저장한다.
ans의 길이가 n과 같다면 모든 점이 제대로 된 순서를 가진 것이니 출력한다.
n이 아니라면 어딘가에 사이클이 있어 잘못된 결과가 나온 것이므로 0을 출력한다.
'Week 01 ~ 04 : 알고리즘 문제 풀이' 카테고리의 다른 글
파이썬 백준 3665 최종 순위 (0) | 2021.11.25 |
---|---|
파이썬 백순 2667 단지번호붙이기 (0) | 2021.11.25 |
파이썬 백준 2056 작업 (0) | 2021.11.25 |
파이썬 백준 1766 문제집 (0) | 2021.11.25 |
파이썬 백준 1516 게임 개발 (0) | 2021.11.25 |