0%

广义圆方树

圆方树是解决一类仙人掌问题的优秀方法。

广义圆方树是解决无向图路径问题的优秀方法,思路简单暴力且优雅。

这篇文章并不讨论解决仙人掌的圆方树,而是介绍广义圆方树和题目。

Native

定义

圆方树的定义十分简单,就是对于一张无向图(一般讨论的是无向联通图),对于所有点双联通分量,建立一个方点,原图中的边全部删除,一个点双联通分量中的点连接一个方点,这些点就叫做圆点,构成一棵有圆点有方点的“圆方树”。(下图是一张网络上广为传播的圆方树建树流程)

基础性质

那么我们可以通过观察圆方树初步总结出一些毫无用处的性质:

  • 方点不会和方点相连,圆点不会和圆点相连

  • 圆方树是一棵无根树

  • 圆方树貌似非常好建

高级性质

进一步挖掘,可以发现圆方树的优美性质:

  • 圆方树可以把原图缩成树,却可以维护原图的连通性
  • 割点是圆方树上度大于 $1$ 的圆点

通过高级性质,我们发现:

  • 既然圆方树可以维护原图的连通性,我们就可以使用方点维护周围圆点的信息,然后进行树剖等操作来维护两点之间简单路径的信息。
  • 既然割点是圆方树上度大于 $1$ 的点,我们就可以轻松的探究图上点与割点本身的关系。

题目

为了不引起题面缩略导致的意义不全,不缩略题面。

CF487E Tourists

圆方树一开始的板子题,可以非常轻松的发现建立圆方树后,可以用方点来维护周围圆点中的最小值,然后树剖寻找最小值即可。

关于带修的问题,修改一个圆点可能修改与之相连的全部方点,菊花图会爆,所以充分利用圆方树的性质,把方点改为维护子树的最小值(建立一个$multiset$),这样每次圆点修改就只需要修改其方点父亲即可。

[POI2008]BLO-Blockade

虽然只是我个人的想法…

我觉得用圆方树做这题的纯属是闲的没事干。

[ZJOI2004]嗅探器

问题可以转化为对于任意一个割点,判断是否可以把 $A$ 点和 $B$ 点断开。

建立圆方树后,如果两个圆点和相同的方点连接,那么就是无解,因为删除哪个点都不能影响它们的通讯。

否则,就可以暴力上跳到它们的 $LCA$,不断寻找度大于 $1$ 的最小编号点。

圆方树有效的忽略了本题中的无用割点(因为他们都不在 $A$ 和 $B$ 所处的子树中),思想又显得比较有趣。