#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N=100010;
vector<int> G[N];
bool isRoot[N];
int father[N];
int findFather(int x)
{
int a=x;
while(x!=father[x])
{
x=father[x];
}
while(a!=father[a])
{
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
void Union(int a,int b)
{
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB)
{
father[faA]=faB;
}
}
void init(int n)
{
for(int i=1;i<=n;i++)
{
father[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 maxH=0;
vector<int> temp,ans;
void DFS(int index,int Height,int pre)
{
if(Height>maxH)
{
temp.clear();
temp.push_back(index);
maxH=Height;
}else if(Height==maxH)
{
temp.push_back(index);
}
for(int i=0;i<G[index].size();i++)
{
if(G[index][i]==pre) continue;
DFS(G[index][i],Height+1,index);
}
}
int main()
{
int a,b,n;
scanf("%d",&n);
init(n);
for(int i=1;i<n;i++)///***
{
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
Union(a,b);
}
int Block=calBlock(n);
if(Block!=1)
{
printf("Error: %d components\n",Block);
}else
{
DFS(1,1,-1);
ans=temp;
DFS(ans[0],1,-1);
for(int i=0;i<temp.size();i++)
{
ans.push_back(temp[i]);
}
sort(ans.begin(),ans.end());
printf("%d\n",ans[0]);
for(int i=1;i<ans.size();i++)
{
if(ans[i]!=ans[i-1])
{
printf("%d\n",ans[i]);
}
}
}
return 0;
}
A1021 Deepest Root
最新推荐文章于 2023-09-05 09:00:00 发布