圆方树

(2 mins to read)

概念

点双联通分量:不存在割点/任意两点间有至少两条点不重复路径特殊:两个点一条边每条边属于一个点双,每个割点可以属于多个点双圆方树中原图的每个点对应一个圆点,一个点双对应一个方点对于每一个点双连通分量,它对应的方点向这个点双连通分量中的每个圆点连边每个点双形成一个“菊花图”,多个“菊花图”通过原图中的割点连接在一起(因为点双的分隔点是割点)

性质

圆点只和方点相连,方点只和圆点相连度数大于1的圆点是原图的割点圆方树是无根树,无论取哪个点为根开始dfs见树,形态都一样

建树

注意两倍空间建完树栈中可能还有点,注意多组数据清空

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
vector<int> G[N], T[N<<1];
void tarjan(int u, int fa)
{
low[u] = dfn[u] = ++clk;
stk[++top] = u;
for(int v : G[u])
{
if(!dfn[v])
{
tarjan(v, u);
low[u] = min(low[u], low[v]);
if(low[v]>=dfn[u])
{
++cnt;
for(int x=0; x!=v; top--)
{
x = stk[top];
T[cnt].pb(x);
T[x].pb(cnt);
}
T[cnt].pb(u);
T[u].pb(cnt);
}
}
else if(v!=fa) low[u] = min(low[u], dfn[v]);
}
}