首页 > 代码库 > 圆方树学习

圆方树学习

圆方树是一种数据结构。

这个东西原始的出处应该是paper

《Maintaining bridge-connected and biconnected components on-line》

tarjan和另外一个人写的...当时叫forest data structure

然后这个东西似乎已经流行很久了?http://blog.csdn.net/PoPoQQQ/article/details/49513819

cjk大爷最近发了一篇博客写这个:http://immortalco.blog.uoj.ac/blog/1955

这篇里的例题啊啥的都是cjk大爷的

首先圆方树是用来解决静态仙人掌问题的。

(这里的静态仙人掌是说仙人掌不会活动,没有link啊,cut啊啥的)

比如开始有一个这样的仙人掌:

技术分享

可以发现这张图上有两个环,哪两个就不说了。

我们把图上的每个环单独当做一个点,我们叫这些新点方点,原来的点叫原点,然后把原来的环连成一个菊花,我们就有了一棵美观的圆方树!

技术分享

啊圆方树就是这么简单的一个东西。

首先怎么建这个圆方树?

我们在仙人掌上面跑tarjan,我们考虑x的一条出边x->b(出边就是说x比b先访问到),那么如果dfn[x]<=low[b],我们发现我们找到了一个环。

(需要注意的是,这里的环可能只是一条边,要特判掉)

此时我们维护一个栈,一直弹栈,弹到b停下,加上x就组成了一个环。

此时我们可以发现弹栈的顺序正好组成了环一圈的顺序,并且正好是倒着的dfs序。

那我们倒过来(当然不倒你舒服也行),就可以二分找一个点在环上什么位置了。

然后我们可以把这些东西拿一坨vector存下来...圆方树就建好啦~

由于比较弱只写了前面的几题...还是比较好写的...

擦这么晚了明天再来更

圆方树学习