알고리즘
[BOJ] 파티
winwin-k9
2024. 6. 8. 20:42
문제
N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다.
어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다.
각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다.
이 도로들은 단방향이기 때문에 아마 그들이 오고 가는 길이 다를지도 모른다. N명의 학생들 중 오고 가는데 가장 많은 시간을 소비하는 학생은 누구일지 구하여라.
풀이
출발지 -> 도착지 -> 출발지의 거리를 탐색하면서 비용이 가장 큰 사람을 구하면 된다.
각 노드별 모두의 최단 겨리를 알아야 하므로 플로이드 워셜을 사용하였다.
플로이드 워셜을 이용하여 노드 모두의 최단 거리를 구한 후, 출발지 + 도착지 + 출발지 모두의
거리가 가장 큰 값을 구하도록 하였다.
import java.lang.\*;
import java.io.\*;
import java.util.\*;
public class Main {
static int\[\]\[\] distance;
static int MAX\_INT = 10000;
public static void main(String\[\] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String\[\] str = br.readLine().split(" ");
int N = Integer.parseInt(str\[0\]);
int M = Integer.parseInt(str\[1\]);
int X = Integer.parseInt(str\[2\]);
int answer = 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) {
continue;
}
distance\[i\]\[j\] = MAX\_INT;
}
}
for (int i = 0; i < M; i++) {
str = br.readLine().split(" ");
int a = Integer.parseInt(str\[0\]);
int b = Integer.parseInt(str\[1\]);
int value = Integer.parseInt(str\[2\]);
distance\[a\]\[b\] = value;
}
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
distance\[i\]\[j\] = Math.min(distance\[i\]\[j\], distance\[i\]\[k\]+distance\[k\]\[j\]);
}
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
Syste[m.out.print(distance\[i\]\[j\]](http://m.out.print\(distance[i][j]) + " ");
}
System.out.println();
}
for (int i = 1; i <= N; i++) {
answer = Math.max(answer, distance\[i\]\[X\] + distance\[X\]\[i\]);
}
System.out.println(answer);
}
}
728x90