

**2207 - 树的中心 **来源: 东方博宜oj oj.czos.cn**思路:先求树的直径,再求直径的中间点(即中心)#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,x,y,k;
int fa[N],dep[N],pre[N];
struct node
{int from,to,next;
}a[N*2]; // N*2的原因:无向图
void add(int u,int v)
{++k;a[k].from=u;a[k].to=v;a[k].next=pre[u];pre[u]=k;
}
// 深搜求父子关系及深度
void dfs(int x,int f)
{fa[x]=f;dep[x]=dep[f]+1;for(int i=pre[x];i!=0;i=a[i].next){if(a[i].to!=f) dfs(a[i].to,x);}
}
int main()
{cin>>n;for(int i=1;i<=n-1;i++){cin>>x>>y;add(x,y);add(y,x);}dfs(1,0);x=1;for(int i=2;i<=n;i++){if(dep[i]>dep[x]) x=i;}dfs(x,0);y=1;for(int i=2;i<=n;i++){if(dep[i]>dep[y]) y=i;}// 此时x和y是直径的两个端点int d=dep[y];if(d%2) //如果深度为奇数,中心点有一个{for(int i=1;i<=d/2;i++) y=fa[y];cout<< y;}else //如果深度为偶数,中心点有两个{for(int i=1;i<=d/2-1;i++) y=fa[y];if(y<fa[y]) cout<< y<< " "<< fa[y];else cout<< fa[y]<< " "<< y;}return 0;
}