本文转自http://fanhq666.blog.163.com/blog/static/81943426201172472943638/

求树重心的方法:(NlogN)

http://www.cnblogs.com/qlky/p/5780933.html

还记得曾经提到过的树的“重心”吗?重心的定义是:以这个点为根,那么所有的子树(不算整个树自身)的大小都不超过整个树大小的一半。

树的重心的一个的性质:

树中所有点到某个点的距离和中,到重心的距离和是最小的;如果有两个重心,那么他们的距离和一样。
这也是“道路修建”带来的启发。(证明:调整法)
树的重心的另一个性质:
把两个树通过一条边相连得到一个新的树,那么新的树的重心在连接原来两个树的重心的路径上。
这个让“重心”名副其实了。。。(证明:。。。自己好好思考一下吧。。。)
还有一个性质:
把一个树添加或删除一个叶子,那么它的重心最多只移动一条边的距离。
(证明:提示:张放想都没想说,要不然那两个不等式就矛盾了)
嗯,不错,有这么多性质,可以出不少恶心题了。。。
不过,我还是更关心一个事情:重心的动态维护。
如何动态呢?
情景1:添加一片叶子
根据已有性质,添加一片叶子之后新的重心要么不动要么向那片叶子的方向移动一下。这样,可以用一个link-cut tree来维护。
我们以重心为根建立这个动态树。每个节点维护它所在的子树的大小。添加叶子等于向一条路径上的维护值增加1,这个可以通过打标记实现。发现不得不移动的时候进行一次换根的操作。因为只可能移动1,所以换根的操作是可以完成的。
我们甚至还可以维护所有点到重心的距离和!这个只需给每个点加一个维护值:这个点为根的子树中所有点到这个点的距离和,通过稍微有点复杂的标记系统还是可以维护的。
情景2:删除一片叶子
只有删除操作?那么离线改成添加吧。。。
不允许离线?那么我们要换一个思路:
定义稍微广义的树的重心:每个点有一个非负权,每个边有个正的长度,到所有点的权乘以距离的和最小的点定义为重心。
注意:树的重心的位置和边的长度没有关系!。
在只有权值修改的情况下,我们可以利用树分治配合基本数据结构来维护树的重心:
注意到,我们可以维护一个子树内的点的权值和(利用dfs序)。这样给定一条边,我们就能够知道树的重心在这条边的哪边(看看哪边权值和大就行了)。
这样,我们可以先找一个比较靠近中心的边,问问应该向哪边走,再分治下去,就像树分治那样(类似二分查找?)。
当然,要想一下其他的技巧来对付”星型数据“,这个应该不难(通过拆点、拆边的技巧)。
利用这个广义一点的重心,我们发现,删除操作其实就是把权修改成0而已,可以在log^2N的时间内动态维护了。
如何处理多重心的情况?”抖动“一下权值使得只有一个重心不就行了。。。那另一个重心在哪里?这个只是个细节问题。。。
能否维护距离和?能否在logN的时间内维护?欢迎讨论(将子树和查询与树分治结合起来?。。。)。
情景3:移动一片叶子
把一个叶子移动到另一个地方。
这个怎么维护呢?其实,我们发现,新的重心应该在原来的重心和叶子新的位置的连线上(证明?应该是对的吧),移动距离很小。于是,也就可以维护了。
情景4:移动一个子树(被移动的子树小于原树的一半,并且保持它的根不变)
这个可以维护吗?
新的重心在原来重心和新子树的接合点的连线上吗?(证出来的欢迎留言)
有一个可以和link-cut tree配合使用的工具,叫做Euler-tour tree,它维护树的欧拉回路,基本元素是边。利用它,可以方便的完成子树的移动,并且给定一条有向边,可以回答这条边指向的子树的大小(Eurler-tour tree中没有”根“以及”父亲“这个概念!)。如果上面的那个论断是对的,那么这个应该可以维护了(复杂度?log^2N吧。。。)
另一个思路是树块划分,把树划分成若干联通块,并且在查询的时候合并相邻的联通块使得每个联通块的大小都是sqrt(N)的级别。这个东西对维护是否有帮助?欢迎交流。。。
情景5:开始N个一个点的树,每次用一条边合并两个树,要求回答新的树的重心
离线?在线?logN?log^2N?sqrt(N)?
等待你去探索
情景6:未来的某一天,某省省选出了一个叫做”疯狂的重心“的数据结构题,时限1分钟,内存若干G,标程几十K,当场无人做。。。。。。

转载于:https://www.cnblogs.com/qlky/p/5781081.html

ACM-树重心的性质及动态维护相关推荐

  1. POJ1655 树重心模板题

    传送门 树重心:树的重心也叫树的质心.对于一棵树n个节点的无根树,找到一个点,使得把树变成以该点为根的有根树时,最大子树的结点数最小.换句话说,删除这个点后最大连通块(一定是树)的结点数最小. 树重心 ...

  2. 【bzoj4184】shallot 线段树+高斯消元动态维护线性基

    题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...

  3. Splay伸展树入门(单点操作,区间维护)附例题模板

    Pps:终于学会了伸展树的区间操作,做一个完整的总结,总结一下自己的伸展树的单点操作和区间维护,顺便给未来的自己总结复习用. splay是一种平衡树,[平均]操作复杂度O(nlogn).首先平衡树先是 ...

  4. POJ - 3784 Running Median(动态维护中位数)

    题目链接:点击查看 题目大意:给出n个数,依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数 题目分析:动态维护中位数,我们可以直接用两个二叉堆来维护,一个是小顶 ...

  5. linux进程池动态维护,可直接商用的跨平台c,c++动态线程池,任务池stpool库

    stpool是一个轻便高效的动态跨平台的线程池/任务池库. 常规线程池的缺点: 1. 总是启动时候就开启固定数目的线程,而不管系统的繁忙状态 (这是很浪费系统资源的). 2. 当任务繁重的时候,即使线 ...

  6. 通过Flask和Redis构造一个动态维护的代理池

    代理池的维护 目前有很多网站提供免费代理,而且种类齐全,比如各个地区.各个匿名级别的都有,不过质量实在不敢恭维,毕竟都是免费公开的,可能一个代理无数个人在用也说不定.所以我们需要做的是大量抓取这些免费 ...

  7. BZOJ2690: 字符串游戏(平衡树动态维护Dfs序)

    Description 给定N个仅有a~z组成的字符串ai,每个字符串都有一个权值vi,有M次操作,操作分三种: Cv x v':把第x个字符串的权值修改为v' Cs x a':把第x个字符串修改成a ...

  8. mysql索引动态维护_MySQL之——索引

    什么是索引? 索引的创建是为了高效的检索数据. MySQL中索引的优缺点和使用注意点: 优点: 1.任意字段 都可以设置索引. 2.可以大大加快检索速度. 缺点: 1.索引的创建和维护需要耗费时间,并 ...

  9. [爬虫架构] 如何在分布式爬虫架构中动态维护一个代理IP池(付费代理)

    前言: 当分布式爬虫使用代理IP技术时,通过直接在爬虫程序中添加平台api接口的方式已经不能满足我们了,因为分布式的爬虫架构每秒的代理IP-URL的请求数会远远大于平台限制的请求频率,当然,对于没有限 ...

最新文章

  1. python常用的基本操作
  2. 计算机网络——网络地址转换(NAT)
  3. 英伟达收购Mellanox接近尾声,将成英伟达史上最大收购案
  4. 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)
  5. 2018-2019 20165208 网络对抗 Exp3 免杀原理与实践
  6. layui表单元素的radio单选框问题
  7. MySql字符串拼接
  8. oracle_用户与概要文件
  9. Tox协议官方文档翻译(一)
  10. 成就更好的自己,就是不停地做减法
  11. python两两组合_python – 一个列表中的两个组合列表
  12. (五)Tomcat源码阅读:Connector组件分析
  13. 网络图如何用计算机计算方法,工程网络图时间参数最简单计算方法.doc
  14. 在Spring Boot中使用数据缓存
  15. mysql 时间戳查询当天数据_mysql 时间戳查询 当天 本周 当月 数据
  16. java实现孪生素数
  17. Python|奇偶判断
  18. linux系统下安装教程_手机安装linux系统安装教程
  19. Linux笔记——挂载光盘
  20. 1333:【例2-2】Blah数集 一本通 队列

热门文章

  1. 深入理解Tomcat系列之一:系统架构(转)
  2. 海量数据处理简要说明(一)
  3. 利用pygments实现django模板内的语法高亮
  4. 带透明png转换成c数组
  5. L1-051 打折-PAT团体程序设计天梯赛GPLT
  6. 宋利兵 mysql_MySQL数据库InnoDB存储引擎Log漫游(3)
  7. oracle 复制数据 insert into、as select
  8. HTTP Status 404 -(tomcat,springmvc,ModelAndView)
  9. 分享:一篇webpack配置基础绝好文章
  10. C#中获取路径的几种方法