Euler Tour Tree与dynamic connectivity
Euler Tour Tree最大的优点就是可以方便的维护子树信息,这点LCT是做不到的.为什么要维护子树信息呢..?我们可以用来做fully dynamic connectivity(online).
Euler Tour Tree
维护将树中的边u--v变成u->v,v->u后的Euler Tour.
- 换根: 因为Euler Tour是一个环,那么我们可以在任意一个k->u的地方切断,然后把这段东西接到最后去,这样就把u变成根了
- Link: 先换根,然后添加u->v与v->u的边就好了,也就是把序列变成(u)+u->v+(v)+v->u
- Cut : 先换根,然后找到u->v与v->u,切掉就好了
- Findroot: 若Euler Tour中的最后一条边是k->u,那么u就是根
那么我们需要维护的就是: 对于每个u任意的一条k->u的指针和每条边对应的指针.
dynamic connectivity
我们维护log(点数)个图G_i以及这些图的生成森林F_i,每个图G_{i+1}都是G{i}删去一些边形成的,我们给每条边附一个权值level表示让这条边出现的最大G_i.
当我们插入一条边, 就在G_0与F_0中加入那条边, 它的level为0.
我们询问时只要询问F_0中是否联通.
当我们删除一条边(u--v:level), 就删除i<=level所有的G_i中的这条边, 然后我们考虑,在如果这次删除将F_i中劈成Sub(u)子树与Sub(v)子树, 我们需要寻找一条替代这条边的边.假设|Sub(u)|<=|Sub(v)|,那么我们在Sub(u)处于G_i中的出边遍历,寻找一条Sub(u)->Sub(v)的边.如果找到了那就是一条替代边,对于遍历到不符合条件的边我们知道它可以插入G_{i+1}中,且level++.
这样每条边最多被遍历到log次,因为每次增加level都会使它所在的最大F_i大小至少减半,而它只会一次担任替代边.
dynamic connectivity(offline)
但是其实这个没什么卵用,如果可以离线的话有更简单的做法
我们考虑使用按秩合并的并查集,那么所有操作都是log的且我们可以回退以前的状态,然后对时间分治就好了.
但是这个做法太不暴力了,而且复杂度没有更优..
其实我们只需要维护对于边的删除时间最大生成树就好了..
LCT 1个log..