http://poj.org/problem?id=1655
树的重心
//#include <bits/stdc++.h>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxN=20005;
int dp[maxN];//dp[i]表示以i为根的,i的最大子树的节点数
int N;
int head[maxN],tot;
struct Graph
{
int to,next;
}G[maxN<<1];
void add(int u,int v)
{
//G[tot]={v,head[u]};
G[tot].to=v;
G[tot].next=head[u];
head[u]=tot++;
}
void initG()
{
memset(head,-1,sizeof(head));
tot=0;
}
int dfs(int u,int pre)
{
int sum=0;
for(int i=head[u];i+1;i=G[i].next)
{
int v=G[i].to;
if(v==pre)continue;
int cnt=dfs(v,u);
sum+=cnt;
dp[u]=max(dp[u],cnt);
}
dp[u]=max(dp[u],N-sum-1);
return sum+1;
}
int main()
{
ios::sync_with_stdio(false);
int T,u,v,w;
cin>>T;
while(T--)
{
cin>>N;
initG();
memset(dp,0,sizeof(dp));
for(int i=2;i<=N;i++)
{
cin>>u>>v;
add(u,v);
add(v,u);
}
dfs(1,-1);
int idx=1;
for(int i=1;i<=N;i++)idx=dp[idx]>dp[i]?i:idx;
cout<<idx<<" "<<dp[idx]<<endl;
}
return 0;
}