题意:
就是去掉树上的一个节点,看看剩下的子树中最大的是多少,然后在这些最大值中求一个最小值,如果有多个点都是最小值,输出序号最小的。
思路:一遍dfs ,保存求出每个点的子树里最大的节点个数。
#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
using namespace std;
const int N=20000+10;
int sum[N],ans[N],n,m;
vector<int>E[N];
void dfs(int cur,int father){
sum[cur]=1;
for(int i=0;i<E[cur].size();i++){
int son=E[cur][i];
if(son==father) continue;
dfs(son,cur);
sum[cur]+=sum[son];
ans[cur]=max(ans[cur],sum[son]);
}
ans[cur]=max(ans[cur],n-sum[cur]);
}
int main(){
int T;scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
sum[i]=0;ans[i]=0;E[i].clear();
}
for(int i=0;i<n-1;i++){
int a,b;scanf("%d%d",&a,&b);
E[a].push_back(b);
E[b].push_back(a);
}
dfs(1,-1);
int minn=1;
for(int i=1;i<=n;i++){
if(ans[minn]>ans[i]){
minn=i;
}
}
printf("%d %d\n",minn,ans[minn]);
}
}