알고리즘
BOJ 2660 : 회장뽑기
minbear
2023. 7. 20. 13:58
#BOJ 2660 : 회장뽑기
2660번: 회장뽑기
입력의 첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다. 둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다. 회원번호는 1부터
www.acmicpc.net
#풀이
회원들의 점수를 계산해서 가장 작은 점수를 가진 회원이 회장이 될 수 있다.
회원들은 양방향 그래프로 나타낼 수 있으며 인접리스트를 통해 정점들의 연결 관계를 저장하였다.
회원들의 점수를 계산하는 방식은
그래프의 height로 나타 낼 수 있다.
1->2->3 은 점수가 2
1->2
1->3
점수가 1
회원의 height가 점수로 나타 낼 수 있다.
BFS를 사용하여 구할 수 있다.
#코드
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n;
int member[51];
vector<int> ans;
vector<int> arr[51];
void bfs(int i) {
int vis[51] = {0,};
queue<int>q;
q.push(i);
while (!q.empty()) {
int a = q.front(); q.pop();
for (auto b : arr[a]) {
if (vis[b] > 0)
continue;
vis[b] = vis[a] + 1;
q.push(b);
}
}
int m_po = 0;
for (int j = 1; j < 51; j++)
{
if (i == j)
continue;
if (m_po < vis[j])
m_po = vis[j];
}
member[i] = m_po;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
int num1, num2;
while (1) {
cin >> num1 >> num2;
if (num1 == -1 && num2 == -1)
break;
arr[num1].push_back(num2);
arr[num2].push_back(num1);
}
for (int i = 1; i <= n; i++) {
bfs(i);
}
int min_po = 100;
for (int i = 1; i <= n; i++)
min_po = min_po > member[i] ? member[i] : min_po;
for (int i = 1; i <= n; i++)
{
if (min_po == member[i]) {
ans.push_back(i);
}
}
cout << min_po << ' ' << ans.size() << '\n';
for (auto a : ans)
cout << a << ' ';
cout << '\n';
return 0;
}