浅谈圆方树

圆方树

简介

  • 在运用tarjan先将连通图缩点、求出点双后,为了方便后续的操作,特别是解决维护每个点双的信息,这是尤为重要的。
  • 那么,我们现在就直奔这个目的(维护点双),特地为每个点双再独立建新点,也就是方点,则原来的点为圆点,那么生成的图就叫圆方树…

常规操作

  • 在求点双的过程中,每个方点与栈内的圆点相连,最后该点双的根节点与方点相连。
  • 不难发现,圆方树中每个方点只与圆点相连,每个圆点只与方点相连。
  • 之后就是依据题意合理运用数据结构或算法再这棵圆方树上进行操作。
  • 每个方点维护的信息中不包括它的父亲圆点,这样修改圆点的时候就只需要修改它的父亲方点即可。

Code(模板):

void tarjan(int x,int f){
    dfn[x]=low[x]=++tim;
    stk[++num]=x;
    vis[x]=1;
    bool flag=1;
    SREP(i,0,E[x].size()){
        int y=E[x][i];
        if(y==f && flag){flag=0;continue;}
        if(!dfn[y]){
            tarjan(y,x);
            chkmin(low[x],low[y]);
            if(low[y]>=dfn[x]){
                Val[++tot].clear();//这里题意维护点权的最值
                //这里tot为新建的方点
                do{
                    Id[stk[num]]=tot;
                    vis[stk[num]]=0;
                    Val[tot].insert(w[stk[num]]);//将点双内的点权塞进multiset中方便维护
                    G[tot].pb(stk[num]);
                }while(y!=stk[num--]);
                G[x].pb(tot);
            }
        }
        else if(vis[y]) chkmin(low[x],dfn[y]);
    }
}

Summary:

  • 圆方树在图论运用之重要,不言而喻,简化了问题的结构,便于问题的解决。
  • 圆方树特别是解决仙人掌的问题,非常实用…(这里仅浅谈…)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值