Day46: [PAT甲级] 1021 Deepest Root (25分)
题源:
来自PAT真题库:
https://pintia.cn/problem-sets/994805342720868352/problems/994805482919673856
代码:
dirty code凑合看吧
#include<iostream>
#include<string>
#include<sstream>
#include<vector>
#include<map>
#include<queue>
#include<set>
#include<cstdio>
#include<algorithm>
using namespace std;
int N;
vector<vector<int> > Graph;
bool collected[10001];
vector<int> res;
queue<int> que;
int d;
int BFS(int x) {
int res = 0;
que.push(x);
collected[x] = true;
while (!que.empty()) {
bool flag = false;
int x = que.front(); que.pop();
for (int i = 0; i < Graph[x].size(); i++) {
if (collected[Graph[x][i]] == false) {
flag = true;
que.push(Graph[x][i]);
collected[Graph[x][i]] = true;
}
}
if (flag) res++;
}
queue<int> empty;
swap(empty, que);
return res;
}
void DFS(int x,int deep) {
d = max(d, deep);
for (int i = 0;i<Graph[x].size(); i++) {
if (collected[Graph[x][i]]==false) {
collected[Graph[x][i]] = true;
DFS(Graph[x][i],deep+1);
}
}
}
int main() {
cin >> N;
res.resize(N + 1, 0);
Graph.resize(N + 1);
if (N <= 1) {
cout << 1;
return 0;
}
int x, y;
for (int i = 0; i < N - 1; i++) {
cin >> x >> y;
Graph[x].push_back(y);
Graph[y].push_back(x);
}
int K = 0;
int sum = 0;
fill(collected,collected+10001,false);
for (int i = 1; i <= N; i++) {
if (collected[i] == false) {
BFS(i);
sum++;
}
}
if (sum != 1) {
printf("Error: %d components", sum);
}
else {
int max = 0;
for (int i = 1; i <= N; i++) {
fill(collected, collected + 10001, false);
collected[i] = true;
DFS(i,0);
res[i] = d;
d = 0;
max = max > res[i] ? max : res[i];
}
for (int i = 1; i <= N; i++) {
if (res[i] == max) {
printf("%d\n",i);
}
}
}
system("pause");
return 0;
}