Cometin'

BOJ-1516 - Python

2021-03-08 at Algorithm category

n개의 건물을 짓는다. 이 때 어떤 건물은 짓기 위해서 다른 건물을 먼저 지어야 할 수도 있다. 이 때 각 건물마다 짓는데 걸리는 최소시간을 출력하는 문제. deque를 사용한 위상정렬 방법을 이용해 풀었다. 진입차수를 줄이는 과정해서 현재 선수 건물과 현재 건물의 값을 더한 것과 저번 선수 건물과 더한 값 혹은 자신의 값을 비교해 큰 것을 할당하는 점화식 answer[next] = max(answer[next], answer[now] + times[next])을 사용하여 풀었다

from collections import deque
import sys
input = sys.stdin.readline

n = int(input())
tree = [[] for _ in range(n+1)]
times = [0 for _ in range(n+1)]
answer = [0 for _ in range(n+1)]
inDegree = [0 for _ in range(n+1)]

for i in range(1, n+1):
    inputs = list(map(int, input().split()))
    times[i] = inputs[0]
    answer[i] = inputs[0]

    if inputs[1] == -1:
        continue
    for before in inputs[1:]:
        if before == -1: break
        tree[before].append(i)
        inDegree[i] += 1

q = deque()
for i in range(1, n+1):
    if inDegree[i] == 0:
        q.append(i)

while q:
    now = q.popleft()
    for next in tree[now]:
        inDegree[next] -= 1
        answer[next] = max(answer[next], answer[now] + times[next])
        if inDegree[next] == 0:
            q.append(next)

[print(ans) for ans in answer[1:]]

hyesungoh

Personal blog by hyesungoh.

I like to share my knowledge for those who wandering in issue.