1005번 : ACM Craft

2022. 1. 22. 22:54문제풀기/백준

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

 

1005번: ACM Craft

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

www.acmicpc.net

전형적인 위상정렬 문제이다.

다만 마지막 도착점에 대한 것이 아니라, 중간의 목표 지점에만 도달하면 되는 것이기 때문에 약간의 greedy를 포함하면 편하다.

=> max_times 배열 이용!

import sys
from collections import deque

input = sys.stdin.readline

t = int(input().rstrip())

for _ in range(t):
    n,k = map(int, input().rstrip().split())
    times = list(map(int,input().rstrip().split()))
    max_times = [0 for _ in range(n+1)]

    times.insert(0,0)
    graph_in = [0 for _ in range(n+1)]
    graph = [[] for _ in range(n+1)]

    for _ in range(k):
        x,y = map(int,input().rstrip().split())
        graph_in[y] += 1
        graph[x].append(y)

    w = int(input().rstrip())

    queue = deque([])

    for i in range(1,n+1):
        if graph_in[i] == 0:
            queue.append(i)
            max_times[i] = times[i]

    result = 0

    while queue:
        now_i = queue.popleft()

        if now_i ==w:
            break

        for next in graph[now_i]:
            graph_in[next] -= 1
            max_times[next] = max(max_times[next],max_times[now_i] + times[next])
            if graph_in[next]==0:
                queue.append(next)


    print(max_times[w])

'문제풀기 > 백준' 카테고리의 다른 글

1806번 : 부분합  (0) 2022.01.10
14179 : 빗물  (0) 2022.01.04
백준 22860번 : 폴더 정리(small)  (0) 2021.10.06
백준 14567번 : 선수과목 (Prerequisite)  (0) 2021.10.05
백준 1548번 : 부분 삼각 수열  (0) 2021.10.05