[XSY] 分割
作者:互联网
题目相当于问 删掉两个点后 图是否仍然连通
割点问题,考虑用dfs树解决
设删去点u,v(dfn[v]<dfn[u])
把 u, v 删去之后整棵树大概断成了几个部分:
• v 上面到根的部分,以及上面挂着的那些东西,记作
h
i
g
h
high
high;
• u 到 v 之间的那一段,以及上面挂着的那些东西,记作
m
i
d
mid
mid;
• u ,v的子树们,记作
l
o
w
u
low_u
lowu,
l
o
w
v
low_v
lowv。
要保证删去u,v后图连通,则
l
o
w
u
low_u
lowu,
m
i
d
mid
mid,
l
o
w
v
low_v
lowv必须想办法和
h
i
g
h
high
high连通
l o w v low_v lowv:每颗子树有非树边连接 h i g h high high
l o w u low_u lowu:每颗子树 有非树边连接 h i g h high high 或 有非树边连接 m i d mid mid且 m i d mid mid有非树边连接 h i g h high high
m i d mid mid:有非树边连接 h i g h high high 或 有非树边连接 l o w u low_u lowu的其中一颗子树,同时这颗子树有非树边连接 h i g h high high
当然, f a [ u ] = = v fa[u]==v fa[u]==v的情况略有不同,且 v = = 1 v==1 v==1时要特判
上面的思路除了 加粗字体的情况 没考虑到,其它都想到了
以下是想不出来的实现:
对于 子树内有非树边连接
h
i
g
h
high
high的条件:
预处理出 low[u] 表示 以u为根的子树通过非树边最高能连到的位置
对于
m
i
d
mid
mid有非树边连接
h
i
g
h
high
high的条件:
预处理出 g[u][k] 表示 u到其
2
k
2^k
2k次祖先 的这一段以及上面挂着的东西中,不算 u,通过非树边最高能到的位置(树上倍增)
(注意:g[u][0]!=low[fa[u]],详见代码)
对于
l
o
w
u
low_u
lowu中有非树边连接
m
i
d
mid
mid的条件:
考虑转化一下条件,
原条件为
l
o
w
u
low_u
lowu通过非树边能连到的位置中至少有一个在[dfn[v]+1,dfn[u]-1]中,
我们将其转化为 若[dfn[v]+1,dfn[u]-1]中没有
l
o
w
u
low_u
lowu通过非树边能连到的位置,那么边(u,v)不能删
预处理出 slow[u] 表示 以u为根的子树通过非树边第二高能连到的位置
标签:分割,XSY,mid,high,lowu,low,非树边,连接 来源: https://blog.csdn.net/Emma2oo6/article/details/114336755