문제 출처
1. 문제설명
- 요약해서 설명하겠다.
- 어떤 그래프가 주어지는데, 모든 정점을 연결하는 최대 깊이를 구하는 문제
- 예시
- 인접행렬 : 1->2, 2->3, 2->4, 2->5
- 모든 점을 잇는데, 깊이가 2가 필요하므로, 답은 2가 된다.
2. 알고리즘 설계
- 처음에 DFS로 구현했는데 문제를 읽어보기만 해도, 뻗어나가는 BFS가 적합함을 알 수 있다.
- 우선, 모든 정점에 대한 깊이를 BFS로 구한다.
- 그리고 깊이를 벡터에 쌓는다.
- 비어있지 않은 최초의 깊이 벡터가 회장 후보가 된다.
3. 전체 코드
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
const int SZ = 55;
bool adj[SZ][SZ], vis[SZ];
vector<int> pres[50];
int n, a, b;
int bfs(int s) {
int ret = 0;
queue<pii> q;
q.push({s, 0});
vis[s] = true;
while(!q.empty()) {
pii cur = q.front();
q.pop();
ret = max(ret, cur.second);
for(int i=1; i<=n; i++) {
if(vis[i] || !adj[cur.first][i]) continue;
vis[i] = true;
q.push({i, cur.second+1});
}
}
return ret;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
while (true) {
cin >> a >> b;
if (a == -1 && b == -1) break;
adj[a][b] = adj[b][a] = true;
}
for (int i = 1; i <= n; i++) {
fill_n(&vis[0], SZ, false);
int cur = bfs(i);
pres[cur].push_back(i);
}
for (int i = 1; i <= n; i++) {
if (pres[i].empty()) continue;
cout << i << ' ' << pres[i].size() << '\n';
for (int x : pres[i]) cout << x << ' ';
break;
}
return 0;
}