최대 1 분 소요

Problem

https://www.acmicpc.net/problem/1005

Idea

순서가 있는 일련의 작업을 차례대로 수행해야 하는 전형적인 위상 정렬 문제이다.

한 건물 B가 건설되기 위해서는 B에 대한 이전 건물이 모두 지어져야 한다. 따라서 B의 건설완료 시간은 B의 건설시간 + B의 이전 건물 중 가장 늦은 건설완료 시간이 된다. 따라서 최소 힙을 이용하여 건설 시작시간이 빠른 순으로 건설하면서 위상 정렬을 구현하였다.

Code

import sys
import heapq

input = sys.stdin.readline

T = int(input())

for _ in range(T):
    N, K = map(int, input().split())
    time = [0] + list(map(int, input().split()))
    edge = [[] for _ in range(N+1)]
    degree = [0 for _ in range(N+1)]
    for _ in range(K):
        u, v = map(int, input().split())
        edge[u].append(v)
        degree[v] += 1
    
    obj = int(input())

    heap = []
    for i in range(1, N+1):
        if degree[i] == 0:
            heapq.heappush(heap, (time[i], i))
        
    while heap:
        pt, pn = heapq.heappop(heap)
        if pn == obj:
            print(pt)
            break
        
        for nn in edge[pn]:
            degree[nn] -= 1
            if degree[nn] == 0:
                heapq.heappush(heap, (pt+time[nn], nn))

Comment