https://www.acmicpc.net/problem/2610
2610번: 회의준비
첫째 중에 회의에 참석하는 사람의 수 N이 주어진다. 참석자들은 1부터 N까지의 자연수로 표현되며 회의에 참석하는 인원은 100 이하이다. 둘째 줄에는 서로 알고 있는 관계의 수 M이 주어진다. 이
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
int n,k;
int dist[101][101];
bool grouped[101];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
memset(dist, 0x3f, sizeof(dist));
cin >> n >> k;
for (int i = 0; i < k; i++) {
int a, b;
cin >> a >> b;
dist[a][b] = 1;
dist[b][a] = 1;
}
for (int i = 1; i <= n; i++) {
dist[i][i] = 0;
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
int cnt = 0;
vector<int> king;
for (int i = 1; i <= n; i++) {
vector<int> g;
for (int j = 1; j <= n; j++) {
if (dist[i][j] < 200 && grouped[j] == false) {
grouped[j] = true;
g.push_back(j);
}
}
if (g.size() > 0) {
cnt++;
int minn = INT_MAX;
int midx = -1;
for (int j = 0; j < g.size(); j++) {
int maxx = 0;
for (int k = 0; k < g.size(); k++) {
maxx = max(maxx, dist[g[j]][g[k]]);
}
if (maxx < minn) {
minn = maxx;
midx = g[j];
}
}
king.push_back(midx);
}
}
sort(king.begin(), king.end());
cout << cnt << '\n';
for (int i = 0; i < king.size(); i++) {
cout << king[i] << '\n';
}
return 0;
}

'Algorithm > problem' 카테고리의 다른 글
백준 1956번 : 운동 - 플로이드와샬 C++ (0) | 2022.02.17 |
---|---|
백준 2458번 : 키 순서 - 플로이드 와샬 알고리즘 (0) | 2022.02.17 |
백준 8983번 사냥꾼 - 이분 탐색 활용 C++ (0) | 2022.02.16 |
백준 6087번 : 레이저 통신 - 다익스트라 C++ (0) | 2022.02.16 |
백준 2108번: 통계학 C++ (0) | 2022.02.16 |