介绍一下动态树LCT(Python)

动态树(LCT)概述

动态树(Link-Cut Tree,LCT)是一种用于维护动态森林数据结构的高效算法,支持以下操作:

  • 动态连接与断开:在树之间添加或删除边。
  • 路径查询与修改:对树上两点间的路径进行信息统计(如最大值、求和)或批量修改。
  • 子树操作:部分变种支持子树查询。

LCT的核心思想是通过**伸展树(Splay Tree)**维护树的虚实链剖分,将操作复杂度均摊到 O(\\log n)。


LCT的核心操作

数据结构定义

每个节点存储以下信息:

python 复制代码
class LCTNode:
    def __init__(self, val):
        self.val = val          # 节点值
        self.left = None       # 左孩子
        self.right = None      # 右孩子
        self.parent = None     # 父节点
        self.rev = False       # 翻转标记(用于路径反转)
        self.size = 1          # 子树大小(可选,用于维护附加信息)
基本Splay操作

Splay操作将节点旋转到当前伸展树的根,同时维护树的平衡:

python 复制代码
def splay(x):
    while not is_root(x):
        y = x.parent
        if not is_root(y):
            push_down(y.parent)  # 下传延迟标记
        push_down(y)
        push_down(x)
        if not is_root(y):
            if (y.parent.left == y) == (y.left == x):
                rotate(y)  # 同方向先转父节点
            else:
                rotate(x)
        rotate(x)
    update(x)  # 更新节点信息
虚实链切换

access(x) 操作将根到 x 的路径变为实链,其他边变为虚边:

python 复制代码
def access(x):
    last = None
    while x:
        splay(x)
        x.right = last  # 将原有右子树变为虚边
        update(x)       # 更新节点信息
        last = x
        x = x.parent
路径反转

make_root(x) 通过反转路径将 x 设为根:

python 复制代码
def make_root(x):
    access(x)
    splay(x)
    x.rev ^= True      # 打翻转标记
    swap(x.left, x.right)  # 实际翻转在push_down时处理

常用操作实现

连接两棵树(Link)

要求 x 和 y 不在同一棵树中:

python 复制代码
def link(x, y):
    make_root(x)
    x.parent = y  # 将x作为y的虚儿子
断开边(Cut)

要求 x 和 y 直接相连:

python 复制代码
def cut(x, y):
    make_root(x)
    access(y)
    splay(y)
    y.left.parent = None  # 断开x与y的边
    y.left = None
    update(y)
路径查询

查询 x 到 y 的路径信息(如求和):

python 复制代码
def query_path(x, y):
    make_root(x)
    access(y)
    splay(y)
    return y.sum  # 假设维护了sum字段

复杂度分析

  • 单次操作:均摊 O(\\log n),依赖Splay树的均摊性质。
  • 空间:O(n),每个节点需存储额外字段。

Python实现注意事项

  1. 延迟标记处理 :翻转标记(rev)需在Splay操作前下传。
  2. 维护附加信息 :如路径求和、最大值等,需在update函数中同步。
  3. 边界条件 :注意is_root的判断(父节点为空或为虚边)。

完整实现需结合具体问题调整,上述代码为简化版框架。

相关推荐
Warson_L2 小时前
高性能架构设计
python·go
databook2 小时前
新数据到手,先跑哪几步检查
python·数据分析
GoAI3 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
czq_26867194873 小时前
Python打卡第46天
开发语言·python
Pniubi3 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
Flynt4 小时前
日涨4000星的OSINT工具,我拿Linus的用户名和一个随机字符串实测了一遍
python·安全
Evand J5 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
choumou_M6 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen6 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#