先dfs一次找到最长的一端,作为根进行第二次dfs,找到所有最长的树。
要考虑只有1个点的情况
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=10010;
int cnt=1,start[N],n,rt[N],dist[N],a[N];
struct edge{
int v,next;
}e[2*N];
void add(int u,int v){
e[cnt].v=v;
e[cnt].next=start[u];
start[u]=cnt++;
}
void dfs(int pre,int rt,int d){
dist[rt]=d;
for(int i=start[rt];i;i=e[i].next){
if(e[i].v!=pre)
dfs(rt,e[i].v,d+1);
}
}
int main(){
cin>>n;
for(int i=1,u,v;i<n;i++){
scanf("%d %d",&u,&v);
add(u,v);
rt[v]=1;
add(v,u);
}
int tot=0,root=-1;
for(int i=1;i<=n;i++)
if(rt[i]==0)
tot++,root=i;
if(tot!=1)
printf("Error: %d components\n",tot);
else{
dfs(0,root,0);
int big=-1,loc;
for(int i=1;i<=n;i++)
if(dist[i]>big)
big=dist[i],loc=i;
dfs(0,loc,0);
a[0]=loc,tot=1,big=-1;
for(int i=1;i<=n;i++)
if(dist[i]>big&&i!=loc)
big=dist[i];
for(int i=1;i<=n;i++)
if(dist[i]==big)
a[tot++]=i;
sort(a,a+tot);
for(int i=0;i<tot;i++)
printf("%d\n",a[i]);
}
return 0;
}