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

5 5 4
5 7 8 2 3
1 4 5
5 2 4
3 2 3
1 2 3| 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|
| 5 | 7 | 8 | 2 | 3 |
이제 최종 출력은 예은이가 1번~n번 지역에 떨어졌을 때 각각 경우에서 얻을 수 있는 아이템 개수를 계산하고 각 경우에서 얻을 수 있는 아이템 개수가 제일 큰 값을 출력하면 된다.
int max_item = Integer.MIN_VALUE; // 최대 아이템 개수
for (int i = 1; i <= n; i++) {
int sum = 0;
for (int j = 1; j <= n; j++) {
if(distance[i][j] <= m) {
sum += items[j];
}
}
if(max_item < sum) max_item = sum;
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int[][] distance; // 거리 배열
static int[] items; // 지역별 아이템 개수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 지역 개수
int m = Integer.parseInt(st.nextToken()); // 수색 범위
int r = Integer.parseInt(st.nextToken()); // 길의 개수
// 지역별 아이템 개수 저장
items = new int[n+1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= n; i++) {
items[i] = Integer.parseInt(st.nextToken());
}
// 인접 행렬 초기화, i와 j의 값이 같은 곳은 0으로 초기화 나머지는 무한대
distance = new int[n+1][n+1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if(i == j) distance[i][j] = 0;
else distance[i][j] = Integer.MAX_VALUE;
}
}
// 길 정보 입력받기
for (int i = 0; i < r; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int l = Integer.parseInt(st.nextToken());
if(distance[a][b] > l) {
distance[a][b] = l;
distance[b][a] = l;
}
}
// 플로이드-워셜을 적용하여 노드간 최단거리 계산하기
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if(distance[i][k] != Integer.MAX_VALUE && distance[k][j] != Integer.MAX_VALUE && distance[i][j] > distance[i][k] + distance[k][j])
distance[i][j] = distance[i][k] + distance[k][j];
}
}
}
int max_item = Integer.MIN_VALUE; // 최대 아이템 개수
for (int i = 1; i <= n; i++) {
int sum = 0;
for (int j = 1; j <= n; j++) {
if(distance[i][j] <= m) {
sum += items[j];
}
}
if(max_item < sum) max_item = sum;
}
System.out.println(max_item);
}
}
// 처음엔 단방향 저장
if(distance[a][b] > l) {
distance[a][b] = l;
}
-------->
// 양방향 거리
if(distance[a][b] > l) {
distance[a][b] = l;
distance[b][a] = l;
}