【题意】不解释了。

【解题方法】其实这题就是一个树的重心,我用两种方法写的,水题。

【AC 代码 1】

//树的重心
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 20005;
const int inf = 0x3f3f3f3f;
int head[maxn],tot,mx,mxcnt,n,siz[maxn];
int minn,minid;
void init(){
    memset(head,-1,sizeof(head));
    tot=0;
}
struct edge{
    int v,next;
}E[maxn*2];
void addedge(int u,int v){
    E[tot].v=v,E[tot].next=head[u],head[u]=tot++;
}
void dfs(int u,int fa)
{
    siz[u]=1;
    int he=-1;
    for(int i=head[u]; ~i; i=E[i].next){
        int v=E[i].v;
        if(v==fa) continue;
        dfs(v,u);
        siz[u]+=siz[v];
        he=max(he,siz[v]);
    }
    he=max(he,n-siz[u]);
    if(he<minn){
        minn=he;
        minid=u;
    }else if(he==minn&&minid<u){
        minid=u;
    }
    return ;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        int u,v;
        init();
        for(int i=1; i<n; i++){
            scanf("%d%d",&u,&v);
            addedge(u,v);
            addedge(v,u);
        }
        minn=inf;
        dfs(1,-1);
        cout<<minid<<" "<<minn<<endl;
    }
    return 0;
}

【AC代码2】
//树形do
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 20010;
int head[maxn],tot,dp[maxn],siz[maxn],n;
struct edge{
    int v,next;
}E[maxn*2];
void init(){
    memset(head,-1,sizeof(head));
    tot=0;
}
void addedge(int u,int v){
    E[tot].v=v,E[tot].next=head[u],head[u]=tot++;
}
void dfs(int u,int fa){
    siz[u]=1,dp[u]=0;
    for(int i=head[u]; ~i; i=E[i].next){
        int v=E[i].v;
        if(v==fa) continue;
        dfs(v,u);
        dp[u]=max(dp[u],siz[v]);
        siz[u]+=siz[v];
    }
    dp[u]=max(dp[u],n-siz[u]);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        init();
        for(int i=1; i<n; i++){
            int u,v;
            scanf("%d%d",&u,&v);
            addedge(u,v);
            addedge(v,u);
        }
        dfs(1,-1);
        int ans1=1,ans2=dp[1];
        for(int i=2; i<=n; i++){
            if(dp[i]<ans2){
                ans2=dp[i];
                ans1=i;
            }
        }
        cout<<ans1<<" "<<ans2<<endl;
    }
}