【模板】树的重心

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
struct edge{
    int to, nxt;
}e[maxn << 1];
int head[maxn], cnt;
int n, ans = inf;

void add(int a,int b){
    e[++cnt].to = b;
    e[cnt].nxt = head[a];
    head[a] = cnt;
}
int st[maxn];

int dfs(int u)
{
    st[u] = 1;
    int sum = 1, res = 0;
    for(int i = head[u]; i; i = e[i].nxt)
    {
        if(!st[e[i].to])
        {
            int s = dfs(e[i].to);
            sum += s;
            res = max(res, s);
        }
    }
    res = max(res, n-sum);
    ans = min(ans,res);
    return sum;
}
int main()
{
    cin >> n;
    for(int i = 0; i < n-1; i++){
        int a, b;
        cin >> a >> b;
        add(a, b); add(b, a);
    }

    dfs(1);
    cout << ans << endl;
    return 0;
}

注意   res是最大连通块中的个数

posted @ 2019-11-12 21:40  ATKevin  阅读(120)  评论(0)    收藏  举报