树的重心

树的重心

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

#include <iostream>
#include <cstdio>

using namespace std;

const int N = 20010;
int e[N],h[N],ne[N];
int n, idx, ans = N;
bool st[N];

void add(int a,int b)
{
    e[idx] = b,ne[idx] = h[a],h[a] = idx ++; 
}

int dfs(int u)
{
    st[u] = true;
    int sum = 1 , res = 0;
    for(int i = h[u]; i != -1 ; i = ne[i])
    {
        int j = st[i];
        if(!st[j])
        {
            int s = dfs(j);
            res = max(res,s);
            sum += s;
        }
    }
    res = max(res, n - sum);
    ans = min(ans, res);

    return sum;
}

int main()
{

    for(int i = 0; i < N; i ++) h[i] = -1;


    scanf("%d", &n);

    for(int i = 0; i < n - 1 ; i ++)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        add(a, b);
        add(b, a);
    }

    dfs(1);

    printf("%d\n",ans);

    return 0;

}

找到联通数最大值的最小值,遍历每一个点算出,最后输出即可,用链式前向星实现,因为是无向图,所以添加两遍.

posted @ 2021-07-26 19:09  别问了我什么都不会  阅读(65)  评论(0)    收藏  举报