흰 스타렉스에서 내가 내리지

[BOJ] 1005번 ACM Craft 본문

Problem Solving

[BOJ] 1005번 ACM Craft

주씨. 2022. 1. 2. 22:11
728x90

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

 

1005번: ACM Craft

첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부

www.acmicpc.net

import sys
from collections import deque

t = int(sys.stdin.readline())

for _ in range(t):
    n, k = map(int, sys.stdin.readline().split())
    dGraph = [[] for __ in range(n+1)]
    inDeg = [0] * (n+1)
    cost = [0] + list(map(int, sys.stdin.readline().split()))
    costSoFar = [0] * (n+1)
    q = deque()
    
    for __ in range(k):
        a, b = map(int, sys.stdin.readline().split())
        inDeg[b] += 1
        dGraph[a].append(b)
        
    
    for i in range(1, n+1):
        if inDeg[i] == 0:
            q.append(i)
            costSoFar[i] = cost[i]
            
    
    while q:
        now = q.popleft()
        for i in dGraph[now]:
            inDeg[i] -= 1
            costSoFar[i] = max(costSoFar[i], costSoFar[now] + cost[i])	# 1
            if inDeg[i] == 0:
                q.append(i)
                
    ans = int(sys.stdin.readline())
    print(costSoFar[ans])

앞으로 다른 문제에서도 마주칠 법한 알고리즘이다. 

이 문제의 핵심 라인은 # 1 번 줄이다.

cost 배열과는 별개로 costSoFar이라는 배열을 추가로 만들어서 큐를 반복할 때 마다 걸린 시간의 최댓값을 갱신해준다. 

'Problem Solving' 카테고리의 다른 글

[BOJ] 9663번 N-Queen  (0) 2022.01.02
[BOJ] 2110번 공유기 설치 ★  (0) 2022.01.02
[BOJ] 1715번 카드 정렬하기  (0) 2022.01.02
[BOJ] 19236번 청소년 상어  (0) 2021.12.30
[BOJ] 16236번 아기 상어  (0) 2021.12.30