위상정렬을 사용하자!
5
10 -1
10 1 -1
4 1 -1
4 3 1 -1
3 3 -1
- 입력을 받으면서 필요한 재료건물을 arr배열에 기록하고, 진입차수(indegree)를 update해준다.
- 진입차수가 0이라면 필요한 재료들을 다 만들어졌다는 뜻으로 queue에 넣어준다.
- queue를 돌면서 건물을 완성할때 해당 건물이 재료가 되는 건물 진입차수를 1 줄여준다.
- 재료건물들은 동시에 여러개 생성할 수 있으므로 제일 오래 걸리는 재료건물시간을 더해준다.
import sys
from collections import defaultdict, deque
input = sys.stdin.readline
N = int(input())
queue = deque()
indegree = [0]*(N+1)
arr = [[0]*(N+1) for _ in range(N+1)]
time = [0]*(N+1)
for i in range(1, N+1):
_input = list(map(int, input().split()))
time[i] = _input[0]
for x in _input[1:-1]:
arr[i][x] = 1
indegree[i] += 1
for i in range(1, N+1):
if indegree[i] == 0:
queue.append(i)
while queue:
x = queue.popleft()
t = 0
for i in range(1, N+1):
if arr[i][x] == 1:
indegree[i] -= 1
if indegree[i] == 0:
queue.append(i)
if arr[x][i] == 1:
t = max(time[i], t)
time[x] += t
for i in time[1:]:
print(i)
'개발 > 알고리즘' 카테고리의 다른 글
[백준 11657] 타임머신 (python) (0) | 2021.05.09 |
---|---|
[프로그래머스] 지형 이동 (python) (0) | 2021.05.09 |
[백준 2458] 키 순서 (python) (0) | 2021.05.04 |
[백준 1922] 네트워크 연결 (python) (0) | 2021.05.04 |
[백준 2252] 줄 세우기 (python) (0) | 2021.05.03 |
최근댓글