树的重心

本文探讨了树的重心概念,介绍了其五个重要性质,并详细阐述了如何通过深度优先搜索(DFS)算法来求解树的重心。重心是树中一个特殊点,使得所有节点到该点的距离和最小。当树的结构发生变化时,重心的位置会有限度地移动。文章还提供了具体的代码实现来辅助理解这一概念。
摘要由CSDN通过智能技术生成

概念

树的重心

性质

1、树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个重心,他们的距离和一样。
2、把两棵树通过一条边相连,新的树的重心在原来两棵树重心的连线上。
3、一棵树添加或者删除一个节点,树的重心最多只移动一条边的位置。
4、一棵树最多有两个重心,且相邻。
5、删除重心后所得的所有子树,节点数不超过原树的1/2,一棵树最多有两个重心。

重心的求解方法

任选一个结点作为根节点用dfs求解
用siz记录子节点个数,son记录删除该点后最大连通分量的子树的节点个数
s o n [ u ] ∗ 2 < = n son[u]*2 <= n son[u]2<=n时记录一下,最多两个结点

Code

void dfs(int u, int fa){
    siz[u]=1, son[u]=0;
    for(auto v:g[u]){
        if(v!=fa){
            dfs(v,u);
            siz[u]+=siz[v];
            son[u]=max(son[u],siz[v]);
        }
    }
    son[u]=max(son[u],n-siz[u]);
    if(son[u]*2 <= n)   r2=r1, r1=u;
    return ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值