还是看了凌大佬的博客才全部ac的
(https://blog.csdn.net/iaccepted/article/details/20454519)
#include <iostream>
#include <vector>
#include <stdio.h>
#include <algorithm>
using namespace std;
int N;
vector<int> g[10002];
int cl[10002];
int cnt=0;
int deepest=0;
vector<int> root;
int longest;
void classify(int a,int n){//dfs找出连通分量
cl[a]=n;
for(int j=0;j<g[a].size();j++){
if(cl[g[a][j]]==0){
classify(g[a][j],n);
}
}
}
void deep(int a, int d){//dfs找最长根
if(d>deepest){
deepest=d;
root.clear();
root.push_back(a);
longest=a;
}else if(d==deepest){
root.push_back(a);
}
for(int j=0;j<g[a].size();j++){
if(cl[g[a][j]]!=0){
cl[g[a][j]]=0;
deep(g[a][j],d+1);
cl[g[a][j]]=1;
}
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("d:/input.txt","r",stdin);
#endif
int i;
cin>>N;
if(N==1){
cout<<1<<endl;
return 0;
}
for(i=0;i<N-1;i++){
int v1,v2;
cin>>v1>>v2;
g[v1].push_back(v2);
g[v2].push_back(v1);
}
for(i=0;i<=N;i++){
cl[i]=0;
}
for(i=1;i<=N;i++){
if(cl[i]==0){
cnt++;
classify(i,cnt);
}
}
if(cnt>1){
cout<<"Error: "<<cnt<<" components";
return 0;
}
for(i=1;i<=N;i++){
if(g[i].size()==1){
deep(i,0);
break;
}
}
deep(longest,0);
deep(longest,0);
sort(root.begin(),root.end());
for(i=1;i<root.size();i++){
if(root[i]==root[i-1]){
root.erase(root.begin()+i);
i--;
}
}
for(i=0;i<root.size();i++){
cout<<root[i]<<endl;
}
return 0;
}