【算法简介】
仙人掌就是把树上多连了一些返祖边,构成了一些环
根据仙人掌这个名字我们也可以较为形象的感受到图的形态
具体的,仙人掌分为点仙人掌和边仙人掌,定义分别为点/边最多属于一个环
之所以把这样的图形单独拿出来处理,就是因为它和树较为类似,有一些好的性质(相较一般图)
我们常用的处理办法是建立圆方树后,把原图转换为一个树进行计算
圆方树建立方法:
我们称原来图上的点为圆点,对于一个点双,我们把这个环上的边断开,新建立一个方点,把这个点双内所有的圆形点与方点相连,这样就构成了一个圆方树
根据仙人掌的性质,我们可以得到没有两个方点相连,特别的,如果对于一般的无向图建立圆方树,那么新树的所有边都是圆点和方点之间的
在建立好这样一个树之后,我们常见的操作是在圆方树上dp,点分治等等
一般来说,可以先考虑在普通树上如何处理,再特殊考虑方点的特殊性即可
【例题1】求仙人掌的最大独立集 BZOJ 4316.小C的独立集
sol.
【例题2】求仙人掌直径 BZOJ1023. [SHOI2008]cactus仙人掌图
sol.
【例题3】仙人掌两点间的最短路 BZOJ2125. 最短路
sol.
广义圆方树
【例题4】带修改,求无向图中两点之间所有简单路径上的最小权值
sol.