浅谈算法——LCT

本文介绍了Link Cut Tree(LCT)的概念,强调其在动态树问题中的应用。LCT结合splay树维护重链,允许边和根的变化。文章详细讲解了splay的维护、access、makeroot、link、cut等操作,并提供了相关操作的实现代码。此外,还推荐了使用LCT的实践题目供读者练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前置技能

splay: 必须

树链剖分: 可选,知道树链剖分会容易理解一些。

以下大部分图片来自https://blog.youkuaiyun.com/saramanda/article/details/55253627

LCT,又叫林克-卡特树,可以用来解决动态树问题。

LCT显然是一棵树,它长这样:

lct-1

这上面有一些粗一点的边,我们把它称为重边;还有一些细一点的,我们把它称为轻边。(就像树链剖分的定义)

每个点连向儿子的重边最多只能有1条(可以没有),因此所有的重边能构成树上的一条一条链,叫做重链

连到重边的儿子叫做嫡长子**重儿子**。

例如上面这个图,1-2-5, 3-7, 4, 6, 8就分别是这棵树的重链。

但是与树链剖分不同的是,LCT中的重边和轻边是可以不断变化的,甚至边/根也可以不断变化,因此我们需要一种灵活一点的数据结构来维护重链,那就是splay啦。

LCT节点的最基本的定义:

struct node
{
    node *son[2],*fa;
    int rev;
};

splay的维护

一棵splay维护LCT的一条重链,splay维护的关键字是点的深度,一个点深度越浅,在平衡树中的位置就越靠左。</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值