最简单的树上dp
ACcdoe:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <cstring>
using namespace std;
#define maxn 20005
struct N{
int to,next;
}my[maxn<<1];
int head[maxn],tot,loop,n;
int dp[maxn],num[maxn];
void init(){
memset(head,-1,sizeof(head));
tot=0;
}
void add(int u,int v){
my[tot].to=v;my[tot].next=head[u];head[u]=tot++;
my[tot].to=u;my[tot].next=head[v];head[v]=tot++;
}
void dfs(int u,int pre){
dp[u]=0;num[u]=1;
for(int i=head[u];i!=-1;i=my[i].next){
int v=my[i].to;
if(v==pre)continue;
dfs(v,u);
dp[u]=max(dp[u],num[v]);
num[u]+=num[v];
}
dp[u]=max(dp[u],n-num[u]);
}
int main(){
scanf("%d",&loop);
while(loop--){
init();
scanf("%d",&n);
for(int i=0;i<n-1;++i){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
dfs(1,-1);
int a=1,b=dp[1];
for(int i=2;i<=n;++i)
if(b>dp[i]){
a=i;
b=dp[i];
}
printf("%d %d\n",a,b);
}
return 0;
}