Balancing Act
定義dp[i]:以i爲根時最大的子樹的值。對於遍歷到的每個i,比較所有的子樹的大小之後,還要注意比較i這個子樹以外的大小(n-num[rt])。
(圖爲引用自一位大佬的博客)
//#include <bits/stdc++.h>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define maxn 20010
int t;
int dp[maxn];
int num[maxn];
vector<int> g[maxn];
int n;
void dfs(int rt,int fa)
{
num[rt]=1;dp[rt]=0;
for(int i=0;i<g[rt].size();i++){
int v=g[rt][i];
if(v==fa) continue;
dfs(v,rt);
dp[rt]=max(dp[rt],num[v]);
num[rt]+=num[v];
}
dp[rt]=max(dp[rt],n-num[rt]);
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++ ) g[i].clear();
for(int i=1;i<=n-1;i++){
int u,v;
scanf("%d %d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,-1);
int ans1=1;int ans2=dp[1];
for(int i=1;i<=n;i++){
if(dp[i]<ans2){
ans2=dp[i];
ans1=i;
}
}
printf("%d %d\n",ans1,ans2);
}
return 0;
}