【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

树链剖分

原创 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;//返回深度较小的点
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

树链剖分

树链剖分

加州伯克利的三角网格剖分程序Triangle

加州伯克利的三角网格剖分程序Triangle http://www-2.cs.cmu.edu/~quake/triangle.html c语言编写,除了一个time的头文件是linux里面的,其他在windows上可以正常编译,做的几个小例子</p

浅谈树链剖分

首先把一个知识摆在前面:倍增。 这是个非常优秀的算法,他普遍应用与何处呢?像树上的倍增求LCA,序列中的倍增RMQ之类的算法,倍增在dp中也有广泛应用,可以大大优化时间和空间。 但是我相信,各位读...

hdu3710(树链剖分计算lca)

突然发现剖分树可以在log(n)的时间里求出lca,于是又删了几十行的代码。 #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;ct

POJ - 2763 树链剖分

树链剖分(轻重链剖分) 仔细想想 自己第一次听说这个这个数据结构大概有两年半的时间了 然而一直不会. 不过现在再回头来看 发现其实也不是很麻烦 首先 在学树链剖分之前最好先把 树形 以及序这三...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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