ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 2660 회장뽑기
    ALGORITHM/BOJ 2022. 8. 15. 22:29

    https://www.acmicpc.net/problem/2660

     

    2660번: 회장뽑기

    입력의 첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다. 둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다. 회원번호는 1부터

    www.acmicpc.net

    2022-08-15


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.StringTokenizer;
     
    public class Main2660 {
        public static void main(String[] args) throws IOException {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(bf.readLine());
            int N = Integer.parseInt(st.nextToken());
            int[][] dist = new int[N+1][N+1];
            for(int[] p: dist) Arrays.fill(p, 987654321);
            while(true) {
                st = new StringTokenizer(bf.readLine());
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());
                if(a == -1 && b == -1break;
                dist[a][b] = 1;
                dist[b][a] = 1;
            }
     
            for(int k = 1; k <= N; k++) {
                for(int i = 1; i <= N; i++) {
                    for(int j = 1; j <= N; j++) {
                        if(dist[i][j] > dist[i][k] + dist[k][j]) dist[i][j] = dist[i][k] + dist[k][j];
                    }
                }
            }
     
            int[] answer = new int[N+1];
            int min = 987654321;
            for(int i = 1; i <= N; i++) {
                int cnt = 0;
                for(int j = 1; j <= N; j++) {
                    if(i != j) {
                        answer[i] = Math.max(answer[i], dist[i][j]);
                    }
                }
                min = Math.min(min, answer[i]);
            }
     
            int count = 0;
            StringBuilder sb = new StringBuilder();
            for(int i = 1; i <= N; i++) {
                if(min == answer[i]) {
                    count++;
                    sb.append(i).append(" ");
                }
            }
            System.out.println(min + " " + count);
            System.out.println(sb.toString());
        }
    }
    cs

     

    #문제풀이

     

    플로이드 와샬로 풀었다. 모든 정점에서 모든 정점으로 가는 최단 거리 값을 구했다. 

     

    정점의 최단 거리를 구한 후, 각 정점에서 가장 긴 거리를 저장해주고 그 각 거리 중 가장 짧은 거리를 구했다.

     

    마지막으로 가장 짧은 거리의 갯수를 세고, 해당 정점들을 출력하였다.

     

     

    'ALGORITHM > BOJ' 카테고리의 다른 글

    [BOJ] 16948 데스 나이트  (1) 2023.06.04
    [BOJ] 1389 케빈 베이컨의 6단계 법칙  (0) 2023.05.21
    [백준] 14226 이모티콘  (0) 2022.08.15
    [백준] 17298 오큰수  (0) 2022.07.25
    [백준] 3273 두 수의 합  (0) 2022.07.25

    댓글

Programming Diary