zoukankan      html  css  js  c++  java
  • 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..

  • 相关阅读:
    Springboot框架添加防止XSS攻击功能
    mybatis传入参数为0被误认为是空字符串的解决方法
    js 遇到 Permission denied to access property ***
    SpringBoot 实现App第三方微信登录
    RedisTemplate和StringRedisTemplate的使用导致数据不一致
    mybatis传入值为null时提示无效的列类型
    Oracle批量插入sql和Mysql大不一样
    SSM+Oracle自动生成uuid作为主键
    mysql5.7创建用户 分配权限
    R语言统计分析-方差分析
  • 原文地址:https://www.cnblogs.com/tmzbot/p/6203412.html
Copyright © 2011-2022 走看看