본문 바로가기

알고리즘/BOJ

2610번

2610번 - 회의준비


문제를 풀어서 해석하면, 연결 요소의 갯수를 구하고, 플로이드 이용값을 이용하는 문제이다.


연결 요소의 갯수를 구하는 방식은 dfs 나 bfs로 구하는데, 이 문제는 dfs를 통해서 구했다.


그리고 플로이드 알고리즘을 통해 구한 값으로 의사 전달 시간 중 최대값이 최소값이 되는 값을 구할 수 있다.


의사 전달 시간 중 최대값이 최소값이란 말 때문에 나도 처음에 문제를 틀렸고, 


질문 게시판에 보면 그에 따른 많은 질문이 있고, 답변도 있어서 그걸 이해하고 문제를 풀 수 있었다.


<정답 코드>


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
#include<iostream>
#include<vector>
#include<algorithm>
 
using namespace std;
const int INF = 987654321;
int cnt = 0;
void dfs(int c, vector<vector<int>> &v, vector<int> &check)
{
    check[c] = cnt;
 
    for (int i = 0; i < v[c].size(); i++)
    {
        int next = v[c][i];
        if (check[next] == 0)
        {
            check[next] = cnt;
            dfs(next, v, check);
        }
    }
}
int main()
{
    //freopen("input.txt", "r", stdin);
    int n, m;
    cin >> n >> m;
    vector<vector<int>> v(n + 1);
    vector<vector<int>> D(n + 1vector<int>(n + 1, INF));
    vector<int> check(n + 1,0);
    while (m--)
    {
        int s, e;
        cin >> s >> e;
        v[s].push_back(e);
        v[e].push_back(s);
        D[s][e] = 1;
        D[e][s] = 1;
    }
 
    for (int i = 1; i <= n; i++)
    {
        D[i][i] = 0;
    }
 
    for (int k = 1; k <= n; k++)
    {
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (D[i][j] > D[i][k] + D[k][j])
                {
                    D[i][j] = D[i][k] + D[k][j];
                }
            }
        }
    }
 
    
    for (int i = 1; i <= n; i++)
    {
        if (check[i]==0)
        {
            cnt++;
            dfs(i,v,check);
        }
    }
 
    vector<int> p(cnt + 1);
    vector<int> s(cnt + 1,INF);
 
    for (int i = 1; i <= cnt; i++)
    {
        for (int from = 1; from <= n; from++)
        {
            int maxx = -1;
            if (check[from] != i) continue;
            for (int to = 1; to <= n; to++)
            {
                if (check[to] != i) continue;
                
                if (maxx < D[from][to])
                {
                    maxx = D[from][to];
                }
            }
 
            if (maxx < s[i])
            {
                s[i] = maxx;
                p[i] = from;
            }
        }
    }
 
    sort(p.begin()+1,p.end());
 
    cout << cnt << "\n";
        
    for (int i = 1; i <= cnt; i++)
    {
        cout << p[i] << "\n";
    }
 
 
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

2458번  (0) 2018.02.20
9205번  (0) 2018.02.20
1613번  (0) 2018.02.20
1219번  (2) 2018.02.19
10217번  (0) 2018.02.19