圆方树
前置芝士:无向图的连通性, t a r j a n tarjan tarjan 点双连通分量
构造
简单来说就是先求出这张图的所有点双连通分量,然后我们规定,在原图中的点叫作 “圆点”,等会儿构造出来的新点叫作 “方点”。
对于每一个点双连通分量,我们把原图的边全都删去,新建一个方点,连向所有这个点双连通分量里的圆点,然后我们就会得到一棵由一些圆点和一些方点组成的树。这棵树就叫做圆方树。
下面画一张图来更好的帮助理解(这里用一个红圈圈出来的就是一个点双):
代码
找点双的时候的那一部分的代码改成这样就好了。
if(dfn[x]) <= low[y]){
++idx;
dcc[idx].push_back(x);
add(x, idx + n); // x 的深度最浅
int z;
do{
z = stk[--top];
dcc[idx].push_back(v);
add(idx + n, z); // z 的深度比 x 大
}while(v != y);
}
性质
- 在圆方树上,度数大于 1 1 1 的点就是原图的割点,而且这个是充要条件。