核心思路:用一个数组存储每个点作为树根的最大高度,和最大树高比较,从而得到最后结果。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4+100;
vector<int> G[maxn];
int height[maxn];
bool vis[maxn] = {false};
int n;
int block=0;
int hightest = 1; //最大树高初始化为1,解决测试点二:n=1,输出1
void DFS(int root){ //判断图的联通分量个数
for(int i=0;i<G[root].size();i++){
if(!vis[G[root][i]]){
vis[G[root][i]] = true;
DFS(G[root][i]);
}
}
}
void findDeepest(int u,int h,int root){ //将根节点传入,方便记录
if(!vis[u]){
vis[u] = true;
for(int i=0;i<G[u].size();i++){
int now = G[u][i];
height[root] = max(height[root],h+1); //该根节点的最大高度
hightest = max(h+1,hightest); //总的最大树高
findDeepest(now,h+1,root);
}
}
}
int main(){
cin>>n;
int c1,c2;
for(int i=0;i<n-1;i++){
cin>>c1>>c2;
G[c1].push_back(c2);
G[c2].push_back(c1);
}
for(int i=1;i<=n;i++){
if(!vis[i]){
vis[i] = true;
DFS(i);
block++;
}
}
if(block>=2)cout<<"Error: "<<block<<" components"<<endl;
else{
fill(height,height+n+1,1);
for(int i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
findDeepest(i,1,i);
}
for(int i=1;i<=n;i++){
if(height[i]==hightest) //某点作为树根的树高与最大树高相等,输出点id
cout<<i<<endl;
}
}
return 0;
}