【无图慎入】Link Cut Tree 总结
link-cut tree
动态树(准确说是维护森林)之一,支持连边,断边,求链上权值和等操作。
splay基础:会rotate和splay就行。还要会一点区间反转操作打标记。很基♂础的东西。
有重链,每条重链用splay来维护,splay中排名为这条重链中深度值,顺便把链的要维护信息(譬如链上点权和)统计了。
边分实边和虚边,实边有ch数组记录,虚边则没有。都有fa数组记录。
虚边链接两条重链。父子关系即原树的父子关系。
连到父亲的边为虚边的点就是这条重链的splay的根。
splay
splay(x)。先从上往下下放一遍,再执行splay。
注意rotate中如果y-z的边是虚边不用往回连。
access
access(x)。最主要操作&&最耗时间的操作,没有之一。
拉一条从x所在树的根节点到x的链。
从x开始往上拉,y初始化为0,每次先splay(x),x左子树为连上去的重链,右子树为连下去的重链。
断掉右子树的边,连成y。(断边指实变虚
makeroot
makeroot(x)。将x变成x所在树的根。
先access(x),这时有一条从root到x的重链。
然后splay(x),再在x上打一个反转标记(这条重链上的深度要反转)
split
split(x,y)。搞出一条重链,两端点为x和y。
makeroot(x),access(y),splay(y)。
不多解释了?
(我习惯把这个直接写进代码,so看不到split函数)
link
link(x,y)。连一条x-y的边。
makeroot(x),然后将FA♂x置为y。
这里连轻边没事的。
cut
cut(x,y)。割♂掉x-y的边。
split(x,y),然后x在y左儿子处不解释。
FA♂x=ch[y][0]=0。
find
找到x所在树的根。主要用于判断连通性???
先access(x),splay(x),再一直往左边走就找到根了。不解释了。。。
写到这里吧。
已经做了的板子题:
洞穴勘测
弹飞绵羊
本博客中博文均为原创,未经博主允许请勿随意转载,谢谢。