2014/11/20
学点自己不知道的东西。
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
vector<int > mp[20005];
int num[20005],vis[20005],dp[20005];
int n, point ,minn;
void init()
{
for(int i =0 ;i < 20005; i++)
mp[i].clear();
}
int Max(int a,int b )
{
return a>b?a:b;
}
int dfs(int x)
{
vis[x] = 1;
num[x] = 1;
for(int i = 0;i < mp[x].size(); i++)
{
if(!vis[mp[x][i]])
{
num[x]+=dfs(mp[x][i]);
}
dp[x] = Max(dp[x],num[mp[x][i]]);
}
dp[x] = Max(dp[x],n - num[x]);
if(dp[x] < minn)
{
minn = dp[x];
point = x;
}
return num[x];
}
int main()
{
int tot ,a ,b;
while(~scanf("%d",&tot))
{
while(tot--)
{
minn = 200000;
scanf("%d",&n);
init();
for(int i =0 ;i < n-1; i++)
{
scanf("%d%d",&a,&b);
mp[a].push_back(b);
mp[b].push_back(a);
}
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
dfs(1);
printf("%d %d\n",point,minn);
}
}
return 0;
}