思路

题目都没看懂就莫名其妙A了,“如果结点数相同输出编号小的”,是指平衡点的编号吗?下面题解是按照这样理解的。
我先讲一下做题思路吧,数据规模很小,1e3,所以可以把每一个节点当作根去找树的最大深度,最大深度最小的第一个节点可以作为平衡点。
找到平衡点之后再来一个push_up对他每一个子节点计算树的节点数,就能求出答案了。

代码

#include<bits/stdc++.h>
#define int ll
#define inf 0x3f3f3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn=1e5+5;
int n,a[maxn],u,v,tmp,ans=0,id;
int sz[maxn],dep[maxn],tmp_dep=0,mx_dep=1e6+7;
vector<int>G[maxn];

int push_up(int node,int pre){
    sz[node]=1;
    for(int i=0;i<G[node].size();i++){
        if(G[node][i]==pre) continue;
        sz[node]+=push_up(G[node][i],node);
    }
    return sz[node];
} 

void dfs(int node,int pre){
//    cout<<node<<" "<<pre<<endl;
    for(int i=0;i<G[node].size();i++){
        int to=G[node][i];
        if(to==pre) continue;
        dep[to]=dep[node]+1;
        dfs(to,node);
    }
    tmp_dep=max(dep[node],tmp_dep);
}

signed main(){
    scanf("%lld",&n);
    for(int i=1;i<n;i++){
        scanf("%lld%lld",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        memset(dep,0,sizeof(dep));
        tmp_dep=0;
        dfs(i,0);
        if(tmp_dep<mx_dep){
            mx_dep=tmp_dep;
            id=i;
        }
    }
//    cout<<mx_dep<<" "<<id<<endl;
    for(int i=0;i<=G[id].size();i++){
        tmp=push_up(G[id][i],id);
        if(tmp>ans) ans=tmp;
    }
    cout<<id<<" "<<ans;
    return 0;
}