본문 바로가기

알고리즘/백준

[백준] 1005번 - ACM Craft

728x90

1005번: ACM Craft

해당 문제는 위상정렬 문제로 해결 할 수 있습니다. 진입차수 가중치를 넣고, 진입차수가 0인 루트노드부터 방문해가면서 거리를 계산하면 됩니다.

import sys
input = sys.stdin.readline

def dfs(node):
    global ans
    for child in graph[node]:
        cost[child] -= 1 # 진입차수를 줄인다.
        ans[child] = max(ans[node] + distance[child], ans[child])

        if cost[child] == 0: # 진입차수가 0이면 이제 방문한다.
            dfs(child)

T = int(input())
for _ in range(T):
    N, K = map(int, input().split())
    distance = [0] + list(map(int, input().split()))
    cost = [0 for _ in range(N+1)]
    graph = [[] for _ in range(N+1)]
    ans = [0 for _ in range(N + 1)]

    for _ in range(K):
        X, Y = map(int, input().split())
        cost[Y] += 1 # 진입차수를 증가시킨다.
        graph[X].append(Y)

    rootnode = []
    for i in range(1, N+1): # 진입차수가 0인 노드부터 시작한다.
        if cost[i] == 0:
            rootnode.append(i)

    W = int(input())
    for node in rootnode:
        ans[node] = distance[node]
        dfs(node)
    print(ans[W])
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2096번 : 내려가기  (0) 2023.10.21
[백준] 2493번 : 탑  (0) 2023.10.21
[백준] 1018번 : 채스판 다시 칠하기  (0) 2023.10.20
[백준] 1027번 : 고층건물  (0) 2023.10.20
[백준] 17141번 : 연구소 2  (0) 2023.10.20