개발/알고리즘
백준 회의준비) 골드 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;
}
}