본문 바로가기

개발/알고리즘

백준 2610 ) 회의 준비 골드 2 C++

    #include <algorithm>
    #include <iostream>
    #include <vector>

    using namespace std;

    int main() {
        int n, m;

        ios::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
        cin >> n >> m;

        vector<vector<int>> dp(n+1, vector<int>(n+1, 100000000));

        for (int i = 1; i <= n; i++) {
            dp[i][i] = 0;
        }

        for(int i= 1; i <= m; i++) {
            int x, y;

            cin >> x >> y;

            dp[x][y] = 1;
            dp[y][x] = 1;
        }


        for(int k = 1; k <= n; k++) {
            for (int i = 1; i <= n; i++) {
                for(int j = 1; j <= n; j++) {
                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
                }
            }
        }

        vector<vector<int>> we(n+1);


        for (int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                if(100000000 != dp[i][j]) {
                    we[i].push_back(j);
                }
            }

            if(we[i].empty()) continue;
            sort(we[i].begin(), we[i].end());
        }


        vector<int> v;
        vector<bool> visited(n+1, false);

        for(int i = 1; i <= n; i++) {

            if(visited[i] || we[i].empty()) continue;

            int index = we[i][0];

            int mins = 1000000000;
            for(auto j : we[i]) {
                visited[j] = true;
                int sum = 0;
                for(auto k : we[i]) {
                    sum = max(sum, dp[j][k]);
                }

                if(mins > sum) {
                    mins = sum;
                    index = j;
                }
            }

            v.push_back(index);

        }

        cout << v.size() << endl;

        sort(v.begin(), v.end());

        for(auto i : v) {
            cout << i << endl;
        }
    }