백준 14938 - 서강 그라운드
Updated:
Java
14938 번 - 서강 그라운드
문제
접근 방법
플로이드 - 와샬로 해결 할 수 있는 문제였다.
각 노드에서 모든 노드의 최단거리를 구한다.
이후 각 노드 별로 다른 노드까지 거리 중 m보다 작은 노드의 아이템 수를 합하여, 최대 아이템 수를 구한다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, m, r, result;
static int MAX_VALUE = 999999999 ;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = stoi(stk.nextToken());
m = stoi(stk.nextToken());
r = stoi(stk.nextToken());
int[][] graph = new int[n + 1][n + 1];
int[] node = new int[n + 1];
// 그래프 세팅.
for(int i = 1; i <= n; i++) {
Arrays.fill(graph[i], MAX_VALUE);
graph[i][i] = 0;
}
// 아이템 수 세팅
stk = new StringTokenizer(br.readLine());
for(int i = 1; i <= n; i++) {
node[i] = stoi(stk.nextToken());
}
// 길 세팅
int a,b,c;
for(int i = 0; i < r; i++) {
stk = new StringTokenizer(br.readLine());
a = stoi(stk.nextToken());
b = stoi(stk.nextToken());
c = stoi(stk.nextToken());
graph[a][b] = c;
graph[b][a] = c;
}
// 플로이드 와샬 사용
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(i == j)
continue;
for(int k = 1; k <= n; k++) {
if(graph[j][k] > graph[j][i] + graph[i][k])
graph[j][k] = graph[j][i] + graph[i][k];
}
}
}
int sum = 0;
for(int i = 1; i <= n; i++) {
sum = 0;
for(int j = 1; j <= n; j++) {
if(i == j) {
sum += node[i];
continue;
}
if(graph[i][j] <= m)
sum += node[j];
}
result = Math.max(sum, result);
}
System.out.println(result);
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}