최대 1 분 소요

Problem

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

Idea

각 떨어진 지점으로부터 최대 m 범위 안의 지점까지의 아이템만을 획득할 수 있다.

따라서 플로이드-워셜 알고리즘을 통해 각 지점 사이의 최단 거리를 모두 구한 뒤, 최단 거리 테이블을 탐색하며 각 지점마다 획득할 수 있는 아이템 수를 구했다.

Code

import sys

input = sys.stdin.readline

n, m, r = map(int, input().split())
item = list(map(int, input().split()))
weight = [[sys.maxsize for _ in range(n)] for _ in range(n)]
for i in range(n):
    weight[i][i] = 0
    
for _ in range(r):
    a, b, l = map(int, input().split())
    weight[a-1][b-1], weight[b-1][a-1] = l, l
    
for k in range(n):
    for i in range(n):
        for j in range(n):
            weight[i][j] = min(weight[i][j], weight[i][k]+weight[k][j])
    
sol = [0 for _ in range(n)]
for i in range(n):
    for j in range(n):
        if weight[i][j] <= m:
            sol[i] += item[j]
         
print(max(sol))

Comment