树链
来源:互联网 发布:eclipse打war包源码 编辑:程序博客网 时间:2024/05/17 06:03
树链剖分(heavy path decomposition,轻重路径剖分),我个人认为,相比起称之为一种“算法”,更像是一种处理树的相关问题时的一种方法,技巧。
其实,真正的树链剖分,应该是套个线段树进行维护的。不过,那个我并不会。所以这里写的是“树链”,真实面目其实应该是某种启发式合并。
首先,定义结点的
给定一棵有根树,对于每个非叶子结点
根据上面的定义,只需一次 DFS 就能把一棵有根树分解成若干重路径(重边组成的路径)和若干轻边。
路径剖分有两条重要定理:
- 对于
u 的子结点v ,当(u,v) 为轻边时,size(v)<size(u)÷2 。
理由:根据定义,所有非叶结点往下都有一条重边。不妨假设size(v)≥size(u)÷2 ,则对于u 向下的重边(u,v′) 来说,size(v′)≥size(v)≥size(u)÷2 ,可得size(u)≥1+size(v)+size(v′)≥size(u)+1 ,与假设矛盾。 - 由定理 1 得,对于任意非根结点
u ,在u 到根的路径上,轻边和重路径的条数均不超过log2n ,因为每碰到一条轻边,size 值就会减半。
这样,在处理一类统计子树相关问题时,可以采用如下策略:
- 从所有叶子结点出发向上考察
- 每当到达一个结点时,要计算其各子树对当前总子树的答案贡献。对于重儿子(以重边连接的儿子),直接将其答案累加。对于轻儿子,dfs暴力统计。
对于重儿子,显然计算效率会比较高。但轻儿子的暴力统计呢?这样会不会导致超时?
其实是不会的。根据定理 2 可知,每个结点到根结点的路径上最多不会存在超过
直接这样讲会感觉很抽象,所以还是要通过例题来说明。详见《树》解题报告。
阅读全文
0 0
- 树链
- HYSBZ 1146 网络管理Network Treap+线段树+树链
- java数据结构与算法-线性探测哈希表
- Android SmsManager 短信群发
- Java构造方法的作用
- 实现热部署时记得设置eclipse开发工具
- [hihocoder1324]希尔伯特曲线
- 树链
- java inerview summary
- 2017百度之星 资格赛1003度度熊与邪恶大魔王
- Oracle笔记
- 数据分析基础教程Numpy指南笔记
- QT Qmessagebox 与 bottonBox 结合应用例子
- 指针和变量
- Kotlin学习系列----Android Studio配置Kotlin
- 简单二维码示例