#include<iostream>
#define gpt(i,a,b) for(int i=a;i<b;i++)
#define blb(i,a) for(int i=op[a];i;i=ne[i])
#include<cstdio>
using namespace std;
int n,m,mm=1,op[50004],ne[50004],to[50004],uliah[50004],rs[50004],minn=1999999999,min_; //uliah:在每个点开会的距离和,rs:每个点的子树节点个数
void in_uint(int&adri){//快读
adri=0;
char chr=getchar();
while(chr<'0'||chr>'9')chr=getchar();
while(chr>='0'&&chr<='9'){
adri*=10;
adri+=chr-'0';
chr=getchar();
}
}
void adge(int a,int b){ //构建邻接表
ne[mm]=op[a];
op[a]=mm;
to[mm++]=b;
ne[mm]=op[b];
op[b]=mm;
to[mm++]=a;
}
void dfs_1(int u,int fa){ //维护rs[i]
rs[u]=1;
blb(i,u){
int v=to[i];
if(v==fa)continue;
dfs_1(v,u);
rs[u]+=rs[v];
}
return;
}
void dfs_2(int u,int fa){ //维护uliah[0];
blb(i,u){
int v=to[i];
//cout<<u<<' '<<v<<' '<<fa<<' '<<uliah[u]<<' '<<rs[u]<<' '<<rs[v]<<'\n';
if(v==fa)continue;
uliah[v]=uliah[u]-rs[v]+n-rs[v];
dfs_2(v,u);
}
return;
}
void dfs_3(int u,int fa){ //维护uliah[i]
if(rs[u]==1){
uliah[u]=0;
return;
}
blb(i,u){
int v=to[i];
if(v==fa)continue;
dfs_3(v,u);
uliah[u]+=uliah[v]+rs[v];
}
return;
}
int main(){
in_uint(n);
gpt(i,0,n-1){
int a,b;
in_uint(a);a--;
in_uint(b);b--;
adge(a,b);
}
dfs_1(0,-999);
dfs_3(0,-999);
dfs_2(0,-999);
gpt(i,0,n)if(uliah[i]<minn){
minn=uliah[i];
min_=i;
}
cout<<min_+1<<' '<<minn;
return 0;
}
有hack数据的话也可以发一下,谢谢