树的直径与重心学习笔记

此文为完成任务所设,可能不易懂,能看懂就将就着看吧

1.定义

树的定义:不存在环且联通的图。

树的直径:树中的最长链

树的重心:为一个点,以此点为根,最大子树的大小最小。

2.求法

树的直径求法分两种:两次 DFS/BFS 与树形 dp 。

首先讲好理解点的树形 dp 。

其实很简单,每个节点维护子树到这个点的最长链和次长链。

对于一个子树,能做出贡献的显然只有最长链。

将由子树最长链得到的链与此节点的最长链与次长链作比较。

若比最长链大,则将原最长链赋给次长链,最长链更新。

若比次长链大,直接更新次长链。

每个节点的最长链与次长链相加即可。

然后是两次 DFS/BFS 。

第一遍找到与任意节点最远的节点,第二遍从找到的节点出发,找到最远的节点。

两次的节点即为树的直径。

树的重心:

一次 DFS ,每次记录下当前子树的大小,最后一个子树大小就是总节点数-此子树大小。

算出最大子树大小后就尝试更新答案。注意:可能有一个,也可能有两个。

posted @   Andy__Lin  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示