很简单的题目,找树的邻接点最大值的最小值,遍历一遍就可以了。。。
ACcode:
#include<cstdio>
#include<cstring>
const int ns=22222;
int n,x,y,top,res,num;
int v[ns],head[ns],to[ns<<1],next[ns<<1];
void add(int p,int s)
{
next[top]=head[p];
to[top]=s;
head[p]=top++;
}
int Max(int a1,int a2)
{
return a1>a2?a1:a2;
}
int Min(int a1,int a2)
{
return a1<a2?a1:a2;
}
int dfs(int rt)
{
v[rt]=0;
int t,e,s=0,x=-1;
for (int i=head[rt];i!=-1;i=next[i])
{
e=to[i];
if (v[e])
{
t=dfs(e);
x=Max(x,t);
s+=t;
}
}
x=Max(x,n-1-s);
// printf("rt=%d,num=%d,res=%d,x=%d\n",rt,num,res,x);
if (num>x) { num=x,res=rt; }
else if (num==x) { res=Min(res,rt); }
return s+1;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
top=res=0,num=1000000;
memset(v,1,sizeof(v));
memset(head,-1,sizeof(head));
for (int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs(1);
printf("%d %d\n",res,num);
}
return 0;
}