zoukankan      html  css  js  c++  java
  • 树的重心的性质及其证明

    想了我好长时间。。。

    1. 树的重心如果不唯一,则至多有两个,且这两个重心相邻
      • 先假设有两个重心 (u,v) 不相邻,考虑它们之间的这条路径,则至少有三个节点(以下的 “它们之间的路径” 都是指 (u,v) 之间的路径)
      • (u)不包含它们之间的这条路径的若干子树中(就是有一个子树是以它们路径上与 (u) 相邻的那个点为根的,先排除那个子树),最小的子树大小是 (size_u),则 (v) 的包含它们路径的那个子树的大小为 (size_u+k,kge 2)。那么这个子树不能是 (u) 的大小最大的子树,否则 (v) 的这个包含它们之间的路径的子树,大小比它还大,(v) 就不是重心了
      • (v) 进行相同的分析,得到同样结论
      • 那么 (u,v) 最大的子树就只能分别是包含它们之间路径的那个子树,假设从它们之间的路径上(不包含它们)的点,延伸出去的点的个数为 (size)(这个 (size) 已经把路径上的点算上了),则它们这个最大的子树的大小就分别是 (v,u)不包含它们之间路径的子树的大小和,加 (size+1),又因为它们都是重心,最大子树都最小,则上面所述的这个 “(v,u) 的不包含它们之间路径的子树的大小和” 应该相等,设其为 (size')
      • 但是发现,若从它们之间的路径上(不包含它们本身)取一点,则这个点沿着它们之间路径的两个子树应该都小于 (size'+size+1),而其他子树显然都小于 (size'),那么 (u,v) 都不是重心,矛盾
      • 则重心必须相邻,又因为这是一个树,所以最多只有两个点相邻,最多两个重心
    2. 一个点是重心,等价于,以这个点为根,它的每个子树的大小,都不会超过整个树大小的一半
      • 假设重心是 (u),它的一个子树大小超过整个树大小的一半,设这个子树的根是 (v)(与 (u) 相邻)
      • (size_i) 表示以 (i) 为根的子树大小,则 (size_v>frac{size_u}{2})
      • 那么,(u) 除了子树 (v) 以外的其它所有子树(把 (u) 本身也计算在内)的大小是 (size_u-size_v)
      • 所以,如果以 (v) 为重心,则它的一个子树是 (size_u-size_v),这个子树就是以 (u) 为根的那个。(size_u-size_v<size_v),此时,(v) “往上”的那个以 (u) 为根的子树小于 (u) 的最大子树大小,而其他“往下”的子树显然也小于,所以可以说明,也说明如果以 (v) 为重心,最大子树的大小小于以 (u) 为根最大子树的大小,则矛盾。得证
      • 再来推若每个子树都不超过整个树的一半,那么一定是重心
      • 设这个每个子树都不超过整个树一半的节点为 (u),重心为 (v),考虑 (u,v) 之间的路径
      • (v) 总会有一个子树包含 (u),(就是包含它们之间路径的那一个),从而包含了,(u) 的除了包含这它们之间路径的那个子树,的所有其他子树,由于 (u) 任意子树大小小于总体的一半,所以 (v) 的这个子树,也就是 (u) 的剩余所有子树,大小 (ge frac{size_u}{2})
      • 那么显然 (v) 不是重心,矛盾。这样,对于任意的 (v eq u),都不是重心,则 (u) 是重心(当然可能存在一个相邻的点,使得它们都有一个等于整体一半的子树,那么就是有两个重心的情况)
      • 则也就顺带着说明了,只有在总点数为偶数时,才可能会出现有两个重心的情况,这两个重心相邻,且都只有两个子树,大小分别为 (frac{num}{2},frac{num}{2}-1)
    3. 树中所有点到某个点的距离和中,到重心的距离和是最小的。如果有两个重心,那么到它们的距离和一样。更进一步,距离和最小与是重心等价
      • 一开始想大力推式子然后反证法证明,结果推了半天发现好像假了
      • 实际上应该是用调整法
      • 就是先假设当前选择一个点 (u),然后看我们把选择的点调整到一个与 (u) 相邻的点,看能不能使得距离和更小
      • 什么样的点能满足上面的性质?那就是以它为根的子树大小大于以 (u) 为根的大小的一半的点,这样让那些其他子树的一共小于一半的点多走 (1),让这大于一半的点少走 (1),总体少走了
      • 直到所有相邻节点为根的子树都小于当前的 (u) 的一半,那么无论往哪个点上再进行移动,都只会使距离和更大,而这样的点,就是重心,得证
    4. 如果一个树增添,或删去一个叶子,则整个树的同一个重心最多移动一个节点
      • 如果是增加节点,那么如果需要移动的话,则是沿着重心和新增的节点之间的路径来移动,这种情况肯定是因为新增节点使得包含它们之间路径的那个子树过大(大于整个树的一半,根据第二条性质)。而往那移动一位,就会让这个子树减少的大小大于等于一,那么就又小于等于了这个树的一半,又由于树最多有两个重心且我们讨论的是“同一个重心”的移动,所以移动一次就够了,移动更多就又不是重心了
      • 如果是删除节点,删除以后导致包含被删除的节点的子树大小减小,那么其他子树可能就大于整个树大小的一半了。则重心往这个子树上移动一位,至于为什么只移动一位,和上面的分析相似
    5. 通过连接一条端点分别在两个树的边,来将两个树合并成一个,那么新的重心肯定是在原来这两个树的重心的路径上
      • 不妨假设连接的两个点就是两个树原来的根
      • 然后可以发现,仍然可以用一种不断调整的方法,假设原先两个重心分别是 (u,v),从 (u) 开始调整,当目前仍在 (u) 所在的原先的那颗树中时,肯定是朝着根调整,因为是根那个方向被接入了另一个树导致大小变大
      • 如果还没调整到原先的根,就符合了最大子树小于等于总结点数一半的条件,自然符合性质,这就说明了,如果新重心在原来 (u) 所在的那个子树上的话,一定在 (u) 到它原来的根的路径上
      • 同理可以说明,如果新重心在 (v) 所在的那个子树上,一定在 (u) 到它原来那个根的路径上
      • 把这两个合起来就是本条性质了

    一个月后,终于把坑填完了
    比如说 洛谷P4299 首都 那个题,要用到第五条性质(或是第四条),我之前也是因为做到这个题才想起来整理一下树重心的性质的,而且发现网上的资源大都只是把结论写上,有证明的很少,所以也花了不少时间

  • 相关阅读:
    js中操作Map集合
    js中json字符串与map的相互转化
    安卓开发--个人软件开发-day05
    javabean工具类方法lombok
    hadoop的datanode没有正常启动
    安卓开发--个人软件开发-day04
    安卓开发--个人软件开发-day03
    bigData学习笔记-hadoop总结
    spring框架学习之mybatis
    安卓开发--个人软件开发-day02
  • 原文地址:https://www.cnblogs.com/suxxsfe/p/13543253.html
Copyright © 2011-2022 走看看