Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 2056 작업

정글러 2021. 11. 25. 15:40
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
import sys
input = sys.stdin.readline
from collections import deque
 
Vn = int(input())
= {}
for i in range(1, Vn + 1) : 
    V[i] = []
= [0 for i in range(Vn + 1)]
parent = [0 for i in range(Vn + 1)]
for i in range(1, Vn + 1) : 
    l = list(map(int, input().split()))
    B[i] = l[0]
    for j in range(2len(l)) : 
        V[l[j]].append(i)
    parent[i] = parent[i] + len(l) - 2
 
que = deque()
for i in range(1, Vn + 1) : 
    if parent[i] == 0 : 
        que.append(i)
 
= B[:]
while que : 
    now = que.popleft()
    for next in V[now] : 
        D[next= max(D[next], D[now] + B[next])
        parent[next= parent[next- 1
        if parent[next== 0 : 
            que.append(next)
print(max(D))
cs

인풋대로 정렬관계 dict를 작성하고 degree의 갯수를 센다.

degree가 0인 점부터 빌드에 걸리는 시간을 확정하여 연결된 점들의 빌드 시간을 갱신한다.

BFS를 마치면 모든 점의 빌드 시간이 D에 기록되었으므로 max D를 출력한다.