圆方树
概念
圆方树是一种解决点双、割点有关问题的利器。
在圆方树中,原来的每个点对应一个圆点,每一个点双对应一个方点。
所以共有 个点,其中 是原图点数, 是原图点双连通分量的个数。
而对于每一个点双连通分量,它对应的方点向这个点双连通分量中的每个点连边。
每个点双形成一个“菊花图”,多个“菊花图”通过原图中的割点连接在一起(因为点双的分隔点是割点)。
显然,圆方树中每条边连接一个圆点和一个方点。
下面有一张图,来自 WC 的 PPT,显示了一张图对应的点双和圆方树形态。
圆方树点数小于 ,这是因为原图中割点的数量小于 ,所以
数组记得开两倍!
另外,若原图不连通,生成的将是一个由“连通分量”个数棵圆方树组成的森林。
如果原图中某个连通分量只有一个点,还需具体情况具体分析。
建树
由于是对每个点双建虚电,考虑 求点双。
具体修改不大,只需将原本“标记点双”操作改为“加边”即可。
1 |
|
用法
类似虚树,圆方树的具体使用视情况而定。
题意为求出路径 上经过的编号最小的割点(不包括两端点)。
我们发现圆方树有以下性质:
所有度大于一的圆点(即所有非叶子节点)都是割点(因为有且只有割点处于多个点双)
因此题意可化为求圆方树上两点间编号最小的节点(因为方点编号都大于 )。
由于只有一组询问,直接遍历树即可。
若有多组询问可考虑倍增。
1 |
|
给圆方树上节点赋点权以解决统计类问题的板子。
确定 后,可选的 为所有路径可经过点集的并。
在图上不易统计,因此搬到圆方树上。
观察后,我们发现一种可行的赋点权方案是给所有方点赋它周围的圆点数(即点双大小),圆点赋-1。
由于路径上每个点双中任意一点均可选,而割点会被算重,且两端点不可选,故此方法是完全正确的。
此时便可以处理单点的贡献了,为经过此点的路径数乘上点权。由于 不确定,记得路径数乘二。
PS: 答案要开 long long!
1 |
|