树链剖分

原创 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
  • 下载

【算法与数据结构】 树链剖分

  • 2016年07月29日 19:49
  • 919KB
  • 下载

FZU 2082 过路费 (树链剖分)

树链剖分裸题。。。不多说。。 代码如下:#include #include #include #include #include #include #include #include ...

树链剖分模板

  • 2015年03月05日 08:33
  • 5KB
  • 下载

树链剖分模板题

  • 2015年05月19日 09:38
  • 3KB
  • 下载

bzoj3924 幻想乡战略游戏 树链剖分&分治树

(对于和我一样没有权限的穷孩子,可以点这里提交)        一句话题意:维护带修改的带权重心到其余点的带权距离和。        首先看怎么求出带权重心。假设现在考虑一个点x,我们维护一个值f[x...

hdu 3966 树链剖分(坑内存)

//hdu 3966 树链剖分+树状数组(节点) #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include ...

HDOJ 题目3966 Aragorn's Story(树链剖分,树状数组)

Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...

HDU-5893 树链剖分+区间合并

List wants to travel Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/...

uva 12655 (树链剖分+生成树 好题)

题意: 给出一张图,s次询问求两点间所有路径中最大的最小值 分析: 首先看到的是一张图,看上去貌似和树无关,仔细想想求两点间路径的最小值如何求,和什么有关,首先想到能不能离线处理,这样一想之后发现...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树链剖分
举报原因:
原因补充:

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