树的重心求解

理解树的重心:性质与求解算法
本文介绍了树的重心概念,即去掉某个节点后使得最大连通分量节点数最小的节点。讨论了树的重心性质,包括删除重心后子树节点数不超过原树一半、树最多有两个重心等。分析了如何通过动态规划寻找重心,通过以任意节点为根构造有根树,并在回溯过程中更新子树信息。最后提到了实现算法的关键步骤。

首先我们先要了解什么是树的重心在这里插入图片描述

树的重心定义为树的某个节点,当去掉该节点后,树的各个连通分量中,节点数最多的连通分量其节点数达到最小值。树可能存在多个重心。如下图,当去掉点1后,树将分成两个连通块:(2,4,5)(2,4,5)(2,4,5)(3,6,7)(3,6,7)(3,6,7),则最大的连通块包含节点个数为3。若去掉点2,则树将分成3个部分,(4)(4)(4)(5)(5)(5)(1,3,6,7)(1,3,6,7)(1,3,6,7)最大的连通块包含4个节点;第一种方法可以得到更小的最大联通分量。可以发现,其他方案不可能得到比3更小的值了。所以,点1是树的重心。

树的重心的一些性质:

  1. 删除重心后所得的所有子树,节点数不超过原树的1/2,一棵树最多有两个重心,且相邻;
  2. 树中所有节点到重心的距离之和最小,如果有两个重心,那么它们距离之和相等;
  3. 两个树通过一条边合并,新的重心在原树两个重心的路径上;
  4. 树删除或添加一个叶子节点,重心最多只移动一条边。

分析

任选一个节点为根,把无根树变成有根树,然后dp[i]表示以i为根的子树的节点个数。不难发现:

在这里插入图片描述

那么假设i是重心,在删除i之后max(dp[j])(j∈Son(i))max(dp[j]) (j∈Son(i))max(dp[j])(jSon(i))还要与i上面的所有节点(可看成一棵子树)比,也就是n-dp[i]。右图中我们假设2号节点是重心,那么除了他们儿子节点为根的子树4和5以外,还有1367节点也可看成一棵子树,所以f[i]=max(max(dp[j]),n−dp[i])f[i] = max(max(dp[j]),n-dp[i])f[i]=max

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值