Separator Theorem

发现可以比较深刻地对【网格图分治模型】进行一个升级。

网格图分治模型:对于一个网格图,每次取其短边中线分治,然后从中线上每个点出发 dfs 整张网格图。于是复杂度是 \(T(S)=O(S\sqrt S)+2T(S/2)=O(S\sqrt S)=O(n^3)\)

在学习了【uoj794 比特之地】后,发现了【Separator Theorem】这个东西。

任意平面图,一定能划分为三个部分 \(A,B,S\)\(|S|=O(\sqrt n)\)\(|A|,|B|<\frac 2 3 n\)\(A,B\) 不连通。

进一步,这个定理还可以应用在带权图上:可划分为 \(A,B,S\)\(|S|=O(\sqrt n)\),使得 \(\sum_{x\in A}w(x),\sum_{x\in B}w(x)<\frac 2 3 \sum w\)

同时这个定理甚至还给出了一个 \(O(n)\) 地构造性算法找出分割集!事实上,【uoj794 比特之地】的做法几乎就是这个定理的构造。

  1. 将平面图连上若干条边使其变成极大平面图(再加入任意一条边都不再是平面图)。其实稍微学一下就知道,是把平面图补成三角剖分图。

  2. 任选一个点(不妨为 \(1\))为起点做 bfs,求出 bfs 树。

    按深度对 bfs 树分层。记层 \(i\) 包含的点数为 \(sz_i\)

  3. 搬运一下我写的【比特之地】的题解中的一部分。

    我们分割的对象是:以一层内的连续的点为祖先(自己也是自己的祖先),深度位于一个区间内的所有点集。

    每次分割,记对象内总共点数为 \(S\)

    首先找到一层,使得它上方和下方的点数都不超过 \(\frac{S}2\),记这一层为 \(p\)\(p\) 其实就是 \(sz\) 的前缀和的中位数。

    然后 \(p\) 向上找到 \(sz_i+p-i\) 的最小值 \(i\),向下找到 \(sz_j+j-p\) 的最小值 \(j\)。我们允许 \(i,j\) 指向第 \(0\) 层和第 \(dep+1\) 层(允许为空)。

    我们来说明 \(sz_i+p-i,sz_j+j-p\) 不会特别大。

    \((sz_i+p-i)_{\min}>2\sqrt{S}\),因为允许空,所以必然 \(p>\sqrt S\)。那么从 \(p\) 往上 \(\sqrt S\) 层的总点数 \(\ge\sum_{i=1}^{\sqrt S}2\sqrt S-i>S\)

    一共才 \(S\) 个点,矛盾了。故 \((sz+p-i)_{\min}\le 2\sqrt S\)。更精细地说,是 \(\le 2\sqrt{上半部分点数}\)

    \(sz_j+j-p\) 是类似的。

    我们先把 \(i,j\) 两层加入分割集。

    接下来处理 \([i,j]\) 内的部分。这里不能套,比如 \(i=j\),并且这一层有巨大多点,那就没法继续分了。


    接下来是【比特之地】与【Separator Theorem】不同的处理方式。

    大佬们给出了结论:因为一些很厉害的性质,一定存在 bfs 树的每条非树边,它与其在 bfs 树上对应的树链形成的简单环可以分割使得各个连通块的大小符合定理的要求。

    而我们知道因为 \(j-i=O(\sqrt S)\),这个简单环的长度至多是 \(2\times 深度差+1\),所以分割集的大小依然是 \(O(\sqrt S)\) 的。

    至于怎么找到这条非树边就看手法了。

    感觉利用三角剖分和对偶图的性质是比较有道理的。以及 bfs 树上非树边两端深度差 \(\le 1\) 的性质。不过这个好像怎么做都比较麻烦,毕竟要利用平面的性质。


    最后贴一下【比特之地】剩余的题解,注意这个并不对一般情况通用。比特之地这个题为了不处理这个麻烦的情况特殊化了题目能处理的图。

    取 dfs 序中点 \(x\),先取出它一直到 \(i\) 层的祖先。
    此时还没有分割完成(即使 \(x\) 是叶子,因为下方的横叉边可能会连通)。不断选取下一层中 dfs 比当前点大的点中 dfs 序最小的点即可。


因为又要补三角剖分,又要平面图,所以在 oi 领域一般不会直接实现定理的构造算法。而且平面图的性质还是太弱了,一般问题只涉及网格图、正多边形内部接几条线段的图。

最有价值的部分应该就是上面找 \(i,j\) 层的部分,以及一个重新看待问题的方式。以后看到图论问题、询问和路径有关、可以离线,这几个条件,就应该考虑这个分治做法。说来这个好像可以看作图上的猫树分治啊。

放一个正多边形的图的题【P6976 Distance on Triangulation】:给出正多边形以及一个三角剖分,求任意两点最短路。

这个题,直接枚举每条边看看用它划分两侧的点数对不对就行了。

更好的视角是,发现分治的过程本质是在对偶图(一棵树)上做点分治。

posted @ 2026-08-19 23:38  FLY_lai  阅读(16)  评论(2)    收藏  举报