树的重心讲解

https://www.luogu.com.cn/blog/Five-shifts-Forever/shu-di-zhong-xin
性质
1.树中所有点到某个点的距离和中,到重心的距离和是最小的(边长为1的情况下)。
2.将树删除某点进行分割后,得到若干子树,最大子树包含的节点数为x,删除重心的方案得到x会最小。

求解方法
遍历所有节点,求出删除该节点后的最大连通块,每次取最优即可。

int n,ans=1e9,d[50005],maxn=1e9;//节点数 重心位置  子节点数目 当前最优的子节点数目
vector <int>g[50005];
void dfs(int cur,int fa)
{
    d[cur]=1;
    int res=0;
    for(int i=0; i<g[cur].size(); i++)
    {
        int x=g[cur][i];
        if(x==fa)
            continue;
            dfs(x,cur);
            d[cur]+=d[x];
            res=max(res,d[x]);//求出子树中包含的最多节点数
    }
    res=max(res,n-d[cur]);//求出父亲方向的节点数
    if(res<maxn)
    {
        maxn=res;
        ans=cur;
    }
}

例题 https://www.luogu.com.cn/problem/P1395

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值