算法详解:树形DP中的树的重心求解
创作时间:
作者:
@小白创作中心
算法详解:树形DP中的树的重心求解
引用
CSDN
1.
https://blog.csdn.net/weixin_74850661/article/details/146164196
在树的算法中,求解树的中心和重心是一类十分重要的算法。本文将详细介绍树的重心的概念、求解方法,并通过一个实践题目加深理解。
树的重心概念
树的重心的定义:重心是树中的一个节点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点称为树的重心。
求解树的重心
求解重心需要记录的值:
- 由于重心关注的是删除一个节点之后,剩余的连通分支中点的最大值,然后这个值要求是最小的,然后需要返回这个最小化的最大值。
删除一个节点之后,会分为几个部分:
- 节点u的所有子树所独立出来的子树
- 以及原本的树删除以u为根节点的树
所以要记录:
- u的所有子树当中,size子树的最多节点数
- sumnunm以u为根节点的节点数(用于dfs的返回值)
- n-sumnum除去以u为根节点的剩余部分的节点数
值得注意的是,遍历的之后是从根节点到叶子节点,但是我们是在
归(叶子节点到根节点)
中的过程中,更新答案的
由于是 无向图,所以要么
设置vis[i]标记节点是否访问过
,要么设置
dfs(u,fa)
其中
fa
是
u
的父亲节点
C++代码实现
int dfs(int u)
{
vis[u] = true; //为了不重复搜索,所以得标记
int size = 0; // 记录u的子树中的最大节点数
int sum = 1; // 记录以u为根节点的子树的节点总数
for(int i = h[u];i!=-1;i=ne[i])
{
int j = e[i];
if (vis[j]) continue;
int s = dfs(j);
size = max(size,s);
sum += s;
}
ans = min(ans,max(size,n-sum));
return sum;
}
Python代码实现
# 使用邻接表来存储点之间的边关系
g = [[]*n ]
vis = [False]*n
ans = n
def dfs(u):
global ans
vis[u] = True
sumnum = 1 # 记录以u为根节点的子树的总节点数
size = 0 # 记录 u的子树当中最大的节点数
for v in g[u]:
if vis[v]: continue # 如果访问过就跳过
s = dfs(v) # 求解出以v为根节点的子树的节点数
size = max(size,s) # 更新答案
sumnum += s
# 更新这个ans
ans = min(ans,max(size,n-sumnum))
return sum
重心实践题目:小红的陡峭值
这题与求解重心的思路十分相似:都是删除一部分,关注剩余的部分的情况
不一样的是,由于删除的是
边
,所以只会将原本的树分为两个部分,但是还是存在一个对应的关系
求解重心 | 求解陡峭值 |
|---|---|
总的值 | 定点数n |
删除的部分 | 边 |
dfs返回的值 | 以u为顶点的子树的总顶点数 |
关注的部分 | 以u为顶点的子树当中,顶点的最大数,这个数目会被拿去更新ans |
import sys
sys.setrecursionlimit(10 ** 6)
n = int(input())
g = [[] for _ in range(n+1)]
# 类似于求解这个 重心的问题,问题的关键在于从根到叶子,同时在叶子返回这个根的时候动态更新答案
esum = 0
for i in range(n-1):
u,v = map(int,input().split())
g[u].append(v)
g[v].append(u)
esum += abs(u-v)
ans = float("inf")
vis = [False]*(n+1)
def dfs(u):
global ans
vis[u] = True
# 需要记录以u为根的陡峭值,以及子树的陡峭值
sumnum = 0
for v in g[u]:
if vis[v]:
continue
s = dfs(v)
sumnum += abs(u-v) + s
# 更新答案
ans = min(abs(esum-abs(u-v)-s-s),ans)
return sumnum
dfs(1)
print(ans)
热门推荐
《八佰》里的“白马”,你读懂了吗?
《身骑白马》:一首融合传统与现代的音乐佳作
曝北京男篮确定第四外援,2米06锋线魔兽斯佩尔曼加盟,曾单场爆砍53分!
睡觉时突然一脚踩空,是身体在“求救”?
警惕脚抽筋:身体的警告与应对之道
标准解读 | 汽车芯片功能安全GB/T 34590《道路车辆 功能安全》标准解读
黄河三角洲:从盐碱地到世界自然遗产的生态蝶变
广州黄埔甘草岭遗址重大发现:304座新石器时代墓葬揭示珠江三角洲文明起源
降火茶饮推荐:哪些茶能有效清热解毒?
Nat Microbiol:经常喝咖啡会极大地改变人体的肠道微生物组组成
这些人类食物也可以给狗狗吃!
新手必看!如何轻松开立股票账户?
儿童学唱歌如何保护嗓子?
科学发声,让孩子唱出天籁之音
我家孩子爱上声乐课:一位家长的陪学心得
苏霍姆林斯基推荐:亲子声乐学习法
小学低年级声乐学习的心理奥秘
"感情债"如何"明白算"?——一起恋爱期间借款纠纷案例分析
STARTRADER:如何制定个人理财计划,目标设定与预算管理
“体育+旅游”魅力无穷!盘点13个长三角体育旅游精品目的地
《黑神话:悟空》里那些爆火的中国古建,背后有玄机
京东美团接入医保,口服降糖药O2O迎来新机遇
驾驶证考试中的那些坑,你踩过吗?
驾考费用大揭秘:你真的了解吗?
双十一驾考费用大揭秘:如何省钱拿驾照?
北京人艺新版《骆驼祥子》来袭!经典再现
《骆驼祥子》:一个时代的悲剧,一面社会的镜子
北京人艺再演《骆驼祥子》:老北京风情再现
从少林到杭州亚运:严月霞的传奇人生能否成为银幕经典?
从少林弟子到顶级保镖:严月霞的职场逆袭之路