Link-Cut Tree

Link-Cut Tree是一种解决动态树问题的数据结构。

动态树问题,大概也就是要动态维护树的路径上的一些信息之类的。

 

定义操作节点Acs,无实义,但对树的形态会造成影响。

其基本思想是动态的树链剖分,每个节点向其最后Acs的子树引一条P边,连续的P边组成P链,这样整棵树便被剖成了许多P链。

对于每条P链,根据深度用Splay维护之,并在Splay的根记录其最浅节点所连点,即为虚边。至此,整棵树成了很多坨Splay和一些虚边。

 

<1>链剖分

便于快速和维护路径信息。

 

<2>Splay

(话说Splay是个愉悦而又神奇的东西,数列信息维护的神器啊!)

之所以用Splay维护,是因为它:

1.能快速得到或更改区间信息。

2.能快速分裂与合并。

3.十分愉♂悦。(无视这条 = =

 

<3>Acs操作

可以说是Link-Cut Tree的操作核心了,几乎所有操作都离不开这个基本操作。也正是这个操作,控制着全局的形态。

设对点v进行一次Acs操作。脑补一下,结果应该是v到根的路径被打通成一条P链。

考虑变化:这条从v通往根的P链上的所有点,原来的P边都应该消失。

Acs Code:

void Access(int d)
{
  int u=d, v=0;
  do{
    Splay(u);
    o[c[u][1]]=1, c[u][1]=v, f[v]=u, o[v]=0;
    Update(u);
    v=u, u=f[u];
  }while(u);
} 
// 形象地来说,就说一路往上打通,剪枝合并剪枝合并……直到根。



 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值