• 【无图慎入】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(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),再一直往左边走就找到根了。不解释了。。。

    写到这里吧。

    已经做了的板子题:
    洞穴勘测
    弹飞绵羊

  • 相关阅读:
    失眠食療
    学会妥协学会弯腰(下册)
    软件工程(第4版·修订版)
    GitHub入门与实践
    iOS开发:从零基础到精通
    Premiere Pro CS6高手成长之路
    网页设计与前端开发从入门到精通Dreamweaver+Flash+Photoshop+HTML+CSS+JavaScript
    CINEMA 4D R17 完全学习手册(第2版)
    1040. 二叉树层次遍历
    1041. 二哥打飞机
  • 原文地址:https://www.cnblogs.com/xzz_233/p/8064958.html
Copyright © 2020-2023  润新知