728x90
이 문제는 수행해야 할 작업과 각 작업마다 걸리는 시간이 주어질 때 모든 작업을 완료하기 위해 필요한 최소 시간을 구하는 문제이다. 단, 서로 선행 관계가 없는 작업들은 동시에 수행 가능하다.
이 문제는 이전의 ACM Craft 문제와 유사한 문제이나, 목표 정점에 도달하는데 걸리는 시간을 구하는 ACM Craft 문제와 달리, 모든 작업을 끝내는데 걸리는 시간을 구한다는 점에서 약간의 차이가 있다. 나머지는 ACM Craft 문제와 거의 같다.
따라서 ACM Craft처럼 위상 정렬과 dynamic programming을 적절히 활용해 각 작업을 완료하는데 걸리는 시간을 구한 뒤, 작업에 끝내는데 걸린 시간 중 가장 긴 시간을 출력하면 된다.
이를 코드로 구현하면 다음과 같다.
from collections import deque
N = int(input())
graph = [[] for _ in range(N+1)]
time = [0 for _ in range(N+1)]
deg = [0 for _ in range(N+1)]
visited = [False for _ in range(N+1)]
for i in range(1, N+1):
arr = list(map(int, input().split()))
time[i] = arr[0]
m = arr[1]
for j in range(2, m+2):
graph[arr[j]].append(i)
deg[i] += 1
queue = deque()
dp = [0 for _ in range(N+1)]
for i in range(1, N+1):
if deg[i] == 0:
queue.append(i)
dp[i] = time[i]
while queue:
u = queue.pop()
for v in graph[u]:
dp[v] = max(dp[v], dp[u] + time[v])
deg[v] -= 1
if deg[v] == 0:
queue.append(v)
print(max(dp))
728x90
'알고리즘 문제' 카테고리의 다른 글
백준 13398번 : 연속합 2 in Python (0) | 2021.07.20 |
---|---|
백준 2169번 : 로봇 조종하기 in Python (0) | 2021.07.15 |
백준 1092번 : 배 in Python (0) | 2021.07.13 |
백준 13904번 : 과제 in Python (0) | 2021.07.08 |
백준 16234번 : 인구 이동 in Python (0) | 2021.07.04 |