개발/알고리즘

백준 회의준비) 골드 2 2610 플로이드 워셜

차가운콩 2024. 12. 4. 11:04

 

풀이: 그룹화, 최대값중의 최소값 

 

#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;
    }
}