树的直径,树的中心,树的重心

树的直径,树的中心,树的重心

树的直径:树上两点间最长距离所对应的路径

求法一:树形dp;

  • 从每个点向下搜索,找到以该点为根到子节点的最大值和次大值
  • 然后将次大值和最大值相加,即求得经过该点的最长路径
  • 然后遍历所有点,找最长的最长路径

树形 DP 可以在存在负权边的情况下求解出树的直径

提出的疑惑
  1. 为什么是向下搜索最大值和次大值值得出直径长度
  2. 为什么要遍历所有点,而不是直接输出顶点的最大值和次大值之和

另一种求法:两次dfs

  • 随便找一个点向下dfs,找到离该点最远的点
  • 再以这个最远的点为根节点,向下找离根节点最远的点
  • 这两个点的距离为直径,两点为直径的端点

若存在负权边,则无法使用两次 DFS 的方式求解直径。

证明过程

树的中心:以树的中心为整棵树的根时,从该跟到每个叶子节点的最长路径最短

求法:换根dp

  • 第一步和树形dp一样找出每个点向下搜索的最大值和次大值
  • 然后时以每个点向上搜索最大值,用父节点的信息更新子节点的信息
  • 父节点的也分为向上的最长路径和向下的最长路径,只需取两者中最大的路径更新子节点的相似最长路径即可
  • 但需要注意的是,父节点向下走的最大路径可能经过该子节点,这时,用父节点的次大值与父节点的向上最大值更新即可
  • 否则就用最大值和向上最大值更新
  • 最后遍历所有点的向下最大和向上最大,取该从某点出发的到某点的最长路径的最小值

树的重心:以树的重心为整课树的根时,它的最大子树最小(也就是删除该点后最大连通块最小)

求法:dfs记录每个点的子节点的数量,以及子树中的最大子子树,总节点个数n-子树中节点个数,则为非该点子树的最大连通量,最大子子树和非子树两者中最大的一者即为删除该点后的最大连通块。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值