这道题综合了并查集和遍历的相关考点。
对于遍历来说,可以使用DFS和BFS,但是个人觉得BFS更加简单一点,只需要逐层遍历然后记录相应的高度信息就可以,更加简洁,后面会补上DFS的相关做法,目前个人还无法太过清晰了解;
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
using std::vector;
using std::queue;
vector<int> mem[10010];
bool vis[10010]={false};
bool isRoot[10010]={false};
int heigth=0;
vector<int>fin;
int se[10010];
int findfather(int x){
while(x!=se[x]){
x=se[x];
}
return x;
}
void Union(int u,int v){
int a=findfather(u);
int b=findfather(v);
if(a!=b)
se[a]=b;
}
void init(){
for(int i=0;i<10010;i++){
se[i]=i;
}
}
int calBlock(int n){
int Block=0;
for(int i=1;i<=n;i++){
isRoot[findfather(i)]=true;
}
for(int i=1;i<=n;i++){
Block+=isRoot[i];
}
return Block;
}
int main(){
queue<int>q;
int num;
scanf("%d",&num);
init();
for(int i=0;i<num-1;i++){
int a,b;
scanf("%d%d",&a,&b);
mem[a].push_back(b);
mem[b].push_back(a);
Union(a,b);
}
int Block=calBlock(num);
if(Block!=1){
printf("Error: %d components\n",Block);
system("pause");
return 0;
}
int charge=0;
for(int i=1;i<=num;i++){
//使用BFS来广度遍历累计层数
q.push(i);
heigth++;
while(q.size()!=0){
bool flag=false;//层数是否有效计数
for(int j=q.size();j>=1;j--){
//一次性取出一层个元素
int index=q.front();
vis[index]=true;
q.pop();
if(mem[index].size()!=0){
for(int k=0;k<mem[index].size();k++){
if(vis[mem[index][k]]==false){
q.push(mem[index][k]);
flag=true;
}
}
}
}
if(flag){
//如果该层有效
heigth++;
}
flag=false;
}
if(heigth>charge){
fin.resize(0);
fin.push_back(i);
charge=heigth;
}else if(heigth==charge){
fin.push_back(i);
}
heigth=0;
for(int i=0;i<10010;i++)
vis[i]=false;
}
sort(fin.begin(),fin.end());
for(int i=0;i<fin.size();i++){
printf("%d\n",fin[i]);
}
system("pause");
return 0;
}