http://poj.org/problem?id=1655
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
#include<string>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
vector<ll> p[20001];
ll num[20001],maxx,n,point;
void dfs(ll u,ll fa){
ll temp=-INF;
num[u]=1;
ll len=p[u].size();
for(ll i=0;i<len;i++){
ll v=p[u][i];
if(v==fa)continue;
dfs(v,u);
//计算以u为根节点的子树的节点数num[u]
num[u]+=num[v];
//temp存以u为根节点的子树的子节点为根节点的子树的最大节点数
temp=max(temp,num[v]);
}
//比较以u为根节点的经过其父节点的那一部分子树的节点数(即n-num[u])
temp=max(temp,n-num[u]);
if(temp<maxx||temp==maxx&&u<point){
//maxx保存最大联通子图的节点数
//point保存对应的节点号,如果节点数相同,保存节点号小的
point=u;
maxx=temp;
}
}
int main(){
ll t;
cin>>t;
while(t--){
memset(num,0,sizeof(num));
ll x,y;
cin>>n;
for(ll i=1;i<=n;i++){
p[i].clear();
}
for(ll i=1;i<n;i++){
cin>>x>>y;
p[x].push_back(y);
p[y].push_back(x);
}
maxx=INF;
point=INF;
dfs(1,-1);
cout<<point<<" "<<maxx<<endl;
}
return 0;
}