圆方树学习笔记
定义
圆方树是一种用于刻画无向图点连通性的手法,其精确的刻画了无向图中点双结构,用于简化问题。
边双缩点之后,可以发现此时我一个无向连通图已经变成了一棵树,拥有非常好的性质。但是点双缩点之后,由于点双是由点链接的,形成了一个神秘的结构,若直接把割点看作是一个边就太草率了,因为有可能有多个点双通过一个点链接。这样就难以处理了。
因此我们考虑把点双中的每个点都连向一个虚拟节点,我们称这个节点为方点,原图中的节点为圆点。那么一个方点可以连向多个圆点,一个圆点也可以连向多个圆点,这样交替进行,就形成了一个树形结构,我们称这棵树为圆方树。
写代码的时候有几个注意事项:
-
特判孤立点。
-
我们不需要特判根节点以及把栈中的点单独作为一个点双,因为根节点的每个儿子都会把根节点判定为割点,这样他们就会组成一个一个的点双,刚好不重不漏。
构建代码:
qwq
void form(int cut, int rt){
int id = ++tot; G[id].pb(cut); G[cut].pb(id);
do{
G[id].pb(stk[top]); G[stk[top]].pb(id);
out[id]
}while(stk[top--] == rt);
}
void build(int u){
low[u] = dfn[u] = ++dfc; stk[++top] = u;
for(int i = head[u]; i; i = edges[i].next){
int v = edges[i].v;
if(!dfn[v]){
build(v); chkmin(low[u], low[v]);
if(low[v] == dfn[u]) form(u, v);
} else chkmin(low[u], dfn[v]);
}
}
一些常见结论:
-
大小大于 \(3\) 的点双每个点一定被一个大小 \(\ge 3\) 的简单环包含。
- 推论:大小大于等于三的点双一定是边双。
-
有边相连的两个点的点连通性一定相同。
- 因此,可以定义一条边 “所属的点双”,结合性质 \(1\) 可知,一条边为割边当且仅当这条边所属的点双大小为 \(2\)。
-
两个点的简单路径上的必经点就是圆方树上两个点简单路径中包含的圆点。
- 事实上,这个也是圆方树构建的初衷。
-
一个点为割点等价于该圆点在圆方树上不是叶子。

浙公网安备 33010602011771号