圆方树
简介
- 在运用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:
- 圆方树在图论运用之重要,不言而喻,简化了问题的结构,便于问题的解决。
- 圆方树特别是解决仙人掌的问题,非常实用…(这里仅浅谈…)