树链剖分

原创 2016年08月29日 23:01:15

一棵树可以剖分成好多的链

鬼都知道ヾノ≧∀≦)o死开!

树链剖分的方法可以将树固定地分为几个链
生成树
跑两遍图
第一遍维护子节点最多的重(zhong)儿子
由重儿子们组成了重链
第二遍维护出重儿子优先的dfs入栈序
这样这个入栈序就可以拆分成几个重链
如图
一棵树
这棵树上边权为1的边为重链,除叶子节点外,每个节点必有重儿子
若存在多个儿子子节点和相等,则任取一个作为重儿子
该树的序为
1246 5 378 9
每个空格隔开的区间都是一条重链
于是一棵树就这么被剖开了
挺简单易懂是不是
为了更快速遍历这些链
我们维护一个top数组
存储每个节点所在重链的深度最浅的点
在第二遍dfs时,可以顺便维护出来
于是我们就可以用一些神奇的数据结构迅速地维护这棵树
树链剖分还可以求lca
非常快O(log n) 即可出答案
过程大概是
每次优先维护二者中深度更深的top
维护从top到当前节点这个区间的值
直到二者top相同
此时二者必在同一链上
最后维护二者之间的区间即可
实现:

int lca(int x,int y)
{
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]])//dep为深度
            swap(x,y);//交换两个数
        //此处可维护链,用一个映射存dfs序,如果需要再存一个反映射方便找回原数
        x=fa[top[x]];
    }
    //此处也可维护链
    retrun dep[x]<dep[y]?x:y;//返回深度较小的点
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

树链剖分

  • 2015-09-22 16:44
  • 800KB
  • 下载

【树链剖分】[BZOJ 4196]软件包管理器

实际上就是个树链剖分,每次询问自己需要的到根节点中有多少开/开了,然后根据需要输出然后线段树Update的时候改一下改成每次更新全部,直接覆盖就行,每次扫描出来的一段肯定是上面半段开下面半段不开(分成...

树链剖分模板

树链剖分模板题

[hdu 5963 朋友] 博弈SG函数+树链剖分

[hdu 5963 朋友] 博弈SG函数+树链剖分1. 题目链接:[hdu 5963 朋友] 2. 题意描述中文题目,直接copy题面了。Problem DescriptionB君在围观一群男生和一群...

HYSBZ 1036 树的统计Count 树链剖分

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 题意:Description   一棵树上有n个节点,编号分别为1到...

BZOJ 4390: [Usaco2015 dec]Max Flow|树链剖分

lca+求个差分就ok啦 感觉树链剖分求lca会快一点然后就没用倍增 写完后交上就哇(wa)了一发 然后发现连了单向边 我** 第二遍交A个感觉异常舒畅 然后发现跑了6s坐 稳了倒数rank1 这酸爽...

BZOJ 1036 [ZJOI2008] 树的统计Count (树链剖分)

题目地址:BZOJ 1036 树链剖分裸题,需要用线段树同时维护最大值与和值两个信息,只是代码量大一点而已。。 代码如下:#include #include #include #includ...

HDU 3966 Aragorn's Story(树链剖分+线段树区间更新+手动扩大内存)

题意: 给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)