题目要求输出给出树的所有重心。
有个结论:一棵有根树至多有两个重心。
#include<iostream>
#include<cstring>
using namespace std;
const int N=50005,M=N<<1;
int h[N],e[M],ne[M],idx;
bool st[N];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int ans=N,n,tot;
int node[2];
int mark[2];
int dfs(int u){
st[u]=true;
int size=1,res=0;
for(int i=h[u];i!=-1;i=ne[i]){
int j=e[i];
if(!st[j]){
int s=dfs(j);
res=max(res,s);
size+=s;
}
}
res=max(res,n-size);
if(res<=ans){
ans=res;
node[tot]=u;
mark[tot]=ans;
tot^=1;
}
return size;
}
int main(){
memset(h,-1, sizeof h);
scanf("%d",&n);
for(int i=0;i<n-1;++i){
int a,b;
scanf("%d%d",&a,&b);
add(a,b),add(b,a);
}
dfs(1);
if(mark[0]==mark[1]){
if(node[0]>node[1]) printf("%d %d\n",node[1],node[0]);
else printf("%d %d\n",node[0],node[1]);
}else{
if(mark[0]<mark[1]) printf("%d\n",node[0]);
else printf("%d\n",node[1]);
}
}