https://www.acmicpc.net/problem/21940
이번 알고리즘은 플로이드입니다. 플로이드 알고리즘은 모든 정점 쌍 사이의 최단 거리를 구해주는 알고리즘으로 알려져 있습니다.
위 문제는 정점마다 제일 값이 큰 친구의 집까지 왕복거리를 저장을 하고, 이 저장된 값 중에 제일 최소값을 반환하면 됩니다. 제일 최소값이 여러 개 일 수있으니 리스트로 저장을 하고 반환하면 됩니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Backjoon_21940_가운데에서_만나기 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
final int max = Integer.MAX_VALUE / 2;
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] map = new int[N+1][N+1];
for(int i = 1 ; i<= N ;i++){
Arrays.fill(map[i], max);
map[i][i] = 0;
}
for(int i = 0 ; i < M ; i++){
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int t = Integer.parseInt(st.nextToken());
map[a][b] = t;
}
for(int i = 1 ; i <= N ; i++){
for(int j = 1 ; j <= N ; j++){
for(int k = 1 ; k <= N ; k++){
if(map[j][k] > map[j][i] + map[i][k]){
map[j][k] = map[j][i] + map[i][k];
}
}
}
}
int K = Integer.parseInt(br.readLine());
ArrayList<Integer> lst = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int i = 0; i < K ; i++){
lst.add(Integer.parseInt(st.nextToken()));
}
int[] answer = new int[N+1];
for(int i = 1; i <= N ; i++){
for(int j = 0; j < K ; j++){
int idx = lst.get(j);
answer[i] = Math.max(answer[i], map[i][idx] + map[idx][i]);
}
}
lst = new ArrayList<>();
int minValue = Integer.MAX_VALUE;
for(int i = 1 ; i <= N ; i++){
if(minValue > answer[i]){
minValue = answer[i];
lst.clear();
lst.add(i);
}else if(minValue == answer[i]){
lst.add(i);
}
}
StringBuilder sb = new StringBuilder();
for(int data : lst){
sb.append(data + " ");
}
System.out.println(sb);
}
}
'알고리즘' 카테고리의 다른 글
[백준/Java] 1197 : 최소 스패닝 트리 (2) | 2025.02.18 |
---|---|
[백준/Java] 14938 : 서강그라운드 (2) | 2025.02.18 |
[백준/Java] 1238 : 파티 (2) | 2025.02.17 |
[백준/Java] 1504 : 특정한 최단 경로 (0) | 2025.02.17 |
[백준/Java] 2457 : 공주님의 정원 (0) | 2025.02.17 |