백준 문제 풀이

플로이드 워셜 > 13424번

qazwsxedc9 2022. 8. 31. 12:54

13424번

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class baekjoon13424 {
    static int n;
    static int m;
    static int [][] map;
    static int INF = 4950001;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int test = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        for(int i = 0; i<test; i++) {
            st = new StringTokenizer(br.readLine()," ");
            n = Integer.parseInt(st.nextToken());
            m = Integer.parseInt(st.nextToken());
            map = new int[n+1][n+1];
            for(int j = 1; j<n+1; j++) {
                for(int h = 1; h<n+1; h++) {
                    if(j == h) { // 자기 자신까지 가는 경로는 0
                        map[j][h] = 0;
                    } else {
                        map[h][j] = INF;
                    }
                }
            }
            for(int j = 0; j<m; j++) {
                st = new StringTokenizer(br.readLine()," ");
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());
                int distance = Integer.parseInt(st.nextToken());
                map[a][b] = distance; // 양방향 통행이 가능
                map[b][a] = distance;
            }
            for(int k = 1; k<n+1; k++) {
                for(int j = 1; j<n+1; j++) {
                    for(int h = 1; h<n+1; h++) {
                        if(map[j][h] > map[j][k] + map[k][h]) {
                            map[j][h] = map[j][k] + map[k][h];
                        }
                    }
                }
            }
            int num = Integer.parseInt(br.readLine()); // 친구들의 수
            int [] friends = new int[num]; // 친구들이 위치한 방 번호를 담은 배열
            int min = INF;  // 친구들의 이동 거리 총합의 최솟값
            int ans = 0;
            st = new StringTokenizer(br.readLine()," ");
            for(int j = 0; j<num; j++) {
                friends[j] = Integer.parseInt(st.nextToken());
            }

            for(int j = 1; j<n+1; j++) {
                int sum = 0; // 친구들의 이동 거리 총합
                for(int h = 0; h<num; h++) {
                    sum += map[friends[h]][j];
                }
                if(sum < min) {
                    min = sum;
                    ans = j;
                }
            }
            sb.append(ans+"\n");
        }
        System.out.println(sb);
    }
}

'백준 문제 풀이' 카테고리의 다른 글

플로이드 워셜 > 13168번  (0) 2022.09.05
최소 신장 트리 > 13418번  (0) 2022.09.01
최소 신장 트리 > 14621번, 14950번, 21924번  (0) 2022.08.29
분할 정복 > 1629번, 10830번  (0) 2022.08.19
투 포인터 > 22862번  (0) 2022.08.17