利用树的重心这一性质

以树的重心为根时,所有子树的大小都不超过整棵树大小的一半。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
const int N = 1e6 + 10;
void solve()
{
    int n;
    cin >> n;
    vector<vector<int>> adj(n);
    for (int i = 0; i < n - 1; i++)
    {
        int a, b;
        cin >> a >> b;
        a--;
        b--;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    int ans1=INT_MAX,ans2=0;
    vector<int> sz(n);
    auto dfs = [&](auto &&dfs, int u, int fa) -> void
    {
        sz[u] = 1;
        int mxchd=0;
        for (int i = 0; i < adj[u].size(); i++)
        {
            int nu = adj[u][i];
            if (nu != fa)
            {
                dfs(dfs, nu, u);
               sz[u]+=sz[nu];
               mxchd=max(mxchd,sz[nu]);
            }
        }
        int wt=max(n-sz[u],mxchd);
        if(wt<=n/2)
        {
            ans1=min(u,ans1);
            ans2=wt;
        }
    };
    dfs(dfs, 0, 0);
    cout<<ans1+1<<' '<<ans2<<'\n';
}
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T;
    T = 1;
    // cin >> T;
    while (T--)
        solve();
    return 0;
}