#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=20005,M=N<<1;
int e[M],ne[M],h[N],idx;
bool st[N];
int ans=N,node,n;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u){
st[u]=true;;
int res=0,size=1;
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(n-size,res);
if(res<ans){
ans=res;
node=u;
}else if(ans==res) node=min(node,u);
return size;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
ans=N;idx=0;
memset(h,-1,sizeof h);
memset(st,0,sizeof st);
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);
printf("%d %d\n",node,ans);
}
}
注意:
1. 多组输入,需要初始化的变量有:
① ans:最小的最大连通块的大小
② idx:静态链表的边结点的编号(否则会RE)
③ h数组:静态链表头结点数组
④ st数组:DFS访问标记