백준 1238 - 파티
Updated:
Java
1238 번 - 파티
문제
접근 방법
모든 NODE에서 출발해 X까지의 왕복거리 중, 최대 왕복 거리를 구하는 문제이다.
각 NODE에서 시작하여, 모든 NODE까지 걸리는 최대 거리를 구한다.
다익스트라의 시간복잡도는 O(N x logN)
이므로,
모든 집에서 출발하여 각 집까지 도달하는데 최대 거리를 구하면,
O(N x N x logN)
이 된다.
N은 1000 이므로, 해결 가능하다.
1000 x 1000 x log1000 < 1억
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, m, x;
static boolean[] vis;
static int[][] map;
static int[][] cost;
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());
x = stoi(stk.nextToken());
map = new int[n + 1][n + 1];
cost = new int[n + 1][n + 1];
int a,b,v;
for(int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
a = stoi(stk.nextToken());
b = stoi(stk.nextToken());
v = stoi(stk.nextToken());
map[a][b] = v;
}
// 모든 NODE에서 다른 NODE 까지 걸리는 거리를 계산
for(int i = 1; i <= n; i++) {
Dijkstra(i);
}
int MAX = 0;
for(int i = 1; i <= n; i++) {
if(i == x)
continue;
MAX = Math.max(MAX, cost[i][x] + cost[x][i]);
}
System.out.println(MAX);
}
static void Dijkstra(int from){
vis = new boolean[n + 1];
int[] node = new int[n + 1];
Arrays.fill(node, Integer.MAX_VALUE);
int curN = 0;
node[from] = 0;
while(true){
int min = Integer.MAX_VALUE;
for(int i = 1; i <= n; i++) {
if(!vis[i] && min > node[i]) {
min = node[i];
curN = i;
}
}
if(min == Integer.MAX_VALUE)
break;
vis[curN] = true;
for(int i = 1; i <= n; i++) {
if(!vis[i] && map[curN][i] != 0) {
if(node[i] > node[curN] + map[curN][i]) {
node[i] = node[curN] + map[curN][i];
}
}
}
}
// 출발 지점에서, 각 지점까지 걸리는 최소 거리를 배열로 저장
for(int i = 1; i <= n; i++) {
cost[from][i] = node[i];
}
}
public static int stoi(String str){
return Integer.parseInt(str);
}
}