Algorithm

[BOJ] 2610. 회의준비

프로그래민 2021. 6. 15. 23:27
반응형

플로이드와샬과 DFS를 같이 활용하는 문제이다.

내용자체를 이해하는데 좀 어려웠던 문제였다. 이 문제에서 결론적으로 구하는 것은 1. 서로 연결되어 있는 노드 중에서 2. 다른 노드로의  최대거리가 가장 작은 노드를 대표로 선정 하는 문제이다. 이러한 과정에서 1번을 해결하는 데에 DFS, 2번을 해결하는데 N값이 100이하이기에 플로이드와샬을 사용하였다. 전체적인 로직을 정리하자면 다음과 같다.

  1. N이 100이하이기에 플로이드와샬을 이용하여 전체 노드의 최단 경로를 map[][] 에 저장
  2. 1~N까지의 노드를 각각 확인하여 다른 노드로의 최대값을 maxDistanceToOther에 저장
  3. 그 후 1~N까지의 노드중 방문안한 노드에 대해 graph를 이용하여 DFS
    1. DFS를 돌면서 maxDistanceToOther 값이 가장 작은 노드를 확인
    2. 그 후 PriorityQueue에 저장후 출력
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package algostudy2;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
 
public class Main_bj_2610_회의준비 {
    static int N;
    static int[][] map;
    static int[] maxDistanceToOther;
 
    static boolean[] visit;
 
    static List<Integer>[] graph;
 
    static PriorityQueue<Integer> answer;
 
    static int distance;
    static int distanceIndex;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
 
        N = Integer.parseInt(br.readLine());
 
        graph = new ArrayList[N + 1];
        for (int i = 1; i <= N; i++) {
            graph[i] = new ArrayList<>();
        }
 
        map = new int[N + 1][N + 1];
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                map[i][j] = (i == j) ? 0 : Integer.MAX_VALUE / 2;
            }
        }
 
        int W = Integer.parseInt(br.readLine());
        for (int i = 0; i < W; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            map[u][v] = 1;
            map[v][u] = 1;
            graph[u].add(v);
            graph[v].add(u);
        }
 
        floyd();
 
        // System.out.println(Arrays.toString(maxDistanceToOther));
 
        answer = new PriorityQueue<>();
 
        visit = new boolean[N + 1];
        for (int i = 1; i <= N; i++) {
            if (visit[i] == false) {
                distance = maxDistanceToOther[i];
                distanceIndex = i;
                dfs(i);
                // System.out.println(distance + ", " + distanceIndex);
                answer.add(distanceIndex);
            }
        }
 
        System.out.println(answer.size());
        while (!answer.isEmpty()) {
            System.out.println(answer.poll());
        }
    }
 
    static void floyd() {
        for (int k = 1; k <= N; k++) {
            for (int i = 1; i <= N; i++) {
                for (int j = 1; j <= N; j++) {
                    if (i != j && map[i][j] > map[i][k] + map[k][j]) {
                        map[i][j] = map[i][k] + map[k][j];
                    }
                }
            }
        }
 
        maxDistanceToOther = new int[N + 1];
 
        for (int i = 1; i <= N; i++) {
            int temp = 0;
            for (int j = 1; j <= N; j++) {
                if (i == j) {
                    continue;
                }
                if (map[i][j] != Integer.MAX_VALUE / 2) {
                    temp = Math.max(temp, map[i][j]);
                }
            }
            maxDistanceToOther[i] = temp;
        }
 
    }
 
    static void dfs(int i) {
        visit[i] = true;
 
        if (distance > maxDistanceToOther[i]) {
            distance = maxDistanceToOther[i];
            distanceIndex = i;
        }
 
        for (Integer next : graph[i]) {
            if (visit[next] == false) {
                dfs(next);
            }
        }
    }
}
 
                                  
반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 2637. 장난감 조립  (0) 2021.06.24
[BOJ] 3665. 최종 순위  (0) 2021.06.24
[BOJ] 1238. 파티  (0) 2021.06.15
[BOJ] 11562. 백양로 브레이크  (0) 2021.06.15
[BOJ] 7579. 앱  (0) 2021.06.12