• 【动态树问题】LCT学习笔记


    我居然还不会LCT QAQ真是太弱了
    必须学LCT QAQ

    ——————————————————线割分是我www———————————-
    LinkCut-Tree是基于Splay(由于Splay能够非常快的支持合并和分离,当然fhqTreap也能够可是复杂度会多一个log)的一种动态维护树的权值形态的方法.基本做法是基于轻重链(注意这里的轻重链和树链剖分的轻重链定义并不一样)将树分成若干Splay森林,然后对这个Splay森林进行各种鬼畜的操作.
    由Sleator和Tarjan发明,操作和查询的复杂度是O(log n) .

    对于每个Splay,其内部排序keyword是Splay中的节点在原树里的深度.因此对其进行中序遍历,得到的结果是一个由浅到深的元素构成的序列.

    LCT的基本操作:
    1.Cut(x) 删除x与其父亲之间的边,即分离一棵子树变成两棵树
    2.Join(v,w,c) 使v称为w的子节点,前提是v是一棵独立的子树的根节点且v,w不在同一棵子树内.即在不同树上的两点间连一条边权为c的边.
    3.Find-Root(x) 返回x所在子树的根节点
    4.Access(x) 将x到其根节点的路径作为一条新的重路径(会改动路径上经过节点的父亲信息和孩子信息)
    5.parent(x) 返回x的父亲节点信息,假设x是根返回NULL
    6.Find-cost(x) 返回x到其父亲节点的权值信息.
    7.Min/MaxCost(x) 返回x到根节点的最小/最大权
    8.Modify/Update(x,delta) 将x到根节点路径上的权值添加或降低delta.(注意到两次使用它能够做到改动一条边/一条链的权值)
    9.Reverse/Evert(x) 将x设为根节点,并将x到原来的根节点上的边反向.(Evert是陈首元论文里用的词然而并不好记不如reverse经常使用啊…)

    当中LCT最核心的操作就是Access.
    在LCT中,我们称经过了Access操作的点为被訪问过的点.对于节点v,v和它全部儿子节点里最后被訪问过的点将被作为重路径(从这里能够看出来轻重链的定义和链剖是全然不一样的).
    Access如何实现?暴力向上找父亲然后改动即可了…
    可能你会认为这个东西复杂度非常渣…
    事实上使用势能分析能够计算得到它的均摊时间复杂度是O(log n)的.(然而我并不会势能分析QAQ)
    详细分析能够询问别的神犇或者參考集训队2006论文《维护森林连通性–动态树》陈首元和2007论文《对Qtree解法的一点研究》杨哲

    对于LCT里的重链,链上相邻两个节点的父子关系是确定的.即父节点记录了其儿子节点是哪一个,儿子节点记录了其父节点是哪一个.而作为轻边而言,父节点并不会记录轻边上的儿子是哪些,可是轻边上的儿子会记录其父节点,这样为我们在进行Access操作提供了方便.
    构造出的Splay森林构成LCT,又叫辅助树.
    有时候我们也把重边叫实变边,轻边叫虚边.(有些人是这么叫的)

    好像完毕了…
    假设以后能够写的我再补.
    假设哪位神犇发现我写的不正确或者有什么不全的请通知我改动

  • 相关阅读:
    Ruby:Hash 排序
    Rails bug: ROR + A server is already running. Check …/tmp/pids/server.pid. Exiting
    MySQL 删除数据的最好的方式
    FATAL ERROR: The persistent cache of section information does not match the current configu...
    http和https的区别
    SAP BusinessObject < Aggregate Navigation >
    BO Server Session Setting
    BusinessObject Port 配置
    重复提交
    FCKeditor
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7220273.html
Copyright © 2020-2023  润新知