居然让这道题卡半天,各种弱啊。。。。
没什么好说的了,觉得这个预处理很亮(我承认之前没想到。。。)
//SGU 134 Centroid
//树形DP
//by night_watcher
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define N 16001
#define pb push_back
struct NODE{
int v,next;
}node[N*2];
int val;
int nc;
int n;
int retc;
int head[N];
int size[N];
int sonsize[N];
void addedge(int u,int v){
node[nc].next=head[u];
node[nc].v=v;
head[u]=nc++;
}
void dfs(int k,int fa){
size[k]=1;
for(int i=head[k];i!=-1;i=node[i].next){
int v=node[i].v;
if(v!=fa){
dfs(v,k);
size[k]+=size[v];
sonsize[k]=max(sonsize[k],size[v]);
}
}
return;
}
int main(){
int i,j,u,v,temp;
int ret[N];
cin>>n;
memset(head,-1,sizeof(head));
retc=nc=0;
val=N;
for(i=0;i<n-1;i++){
cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
dfs(1,0);
for(i=1;i<=n;i++){
temp=max(n-size[i],sonsize[i]);
if(val>temp){
val=temp;
retc=1;
ret[0]=i;
}
else if(val==temp){
ret[retc++]=i;
}
}
cout<<val<<" "<<retc<<endl;
sort(ret,ret+retc);
cout<<ret[0];
for(i=1;i<retc;i++){
cout<<" "<<ret[i];
}
cout<<endl;
return 0;
}