线性寻找k连通稀疏子图(上)
部分证明和算法在看论文的时候进行了一点点脑补,脑补上要是出了偏差...本人一概不负责(x
原文: Hiroshi Nagamochi and Toshihide Ibaraki 1992a. Linear time algorithms for finding a sparse k-connected spanning subgraph of a k-connected graph. Algorithmica 7, 583–596.
目标和直觉
对于一个 k 连通图,寻找一个包含最小边数的 k 联通的子图被证明是 npc 的,所以快速寻找一个边数不多的 k 连通子图是全文的目标。
我们这里先考虑边联通的情况。
一个直观的想法是,一个 k 连通图如果可以被分解成 k 个生成树,那么这一定可以充分的证明它是一个 k 联通图。
但是很遗憾的是并不是所有 k 连通图都可以这么分解,一个最简单的例子,是 k=2 的三元环。
但是每次取一个极大生成森林的做法却有非常好的性质。
极大生成森林
考虑对于一个图 G=(V,E) ,把它分解成若干个生成森林 F_i = (V, E_i) ,使得 F_i 是 G - E_1 \cup E_2 \cup ... \cup E_{i-1} 的极大生成森林
令 G_i = (V, E_1 \cup E_2 ... \cup E_i) , \lambda(x,y;G) 为点 x 和点 y 在 G 中的最小割
那么 G_i 会满足 \lambda(x, y; G_i)\geq \min\{\lambda(x,y,G),i\}
也就是说,虽然我们的分解每次可能只是一个森林,但是如果我们把前 k个分解的边集并起来,已经可以使得原图中所有 k连通的点对 k连通了!
证明如下:
考虑 \lambda(x, y; G_i)\geq \min\{\lambda(x,y;G),i\}
并且 \lambda(x, y; G_{i+1})<\min\{\lambda(x,y;G),i+1\}
那么就意味着 \lambda(x, y; G_i)=\lambda(x,y;G_{i+1})=i
那么在 G_{i+1} 中就存在一个割 |W|=i 使得 x 和 y 不连通,并且把图分成 X 集和 Y 集
然而因为原图中最小割 \lambda(x,y;G)>i ,所以 (V,E-E_1\cup E_2 ... \cup E_i) 中一定存在跨越两个集合的边
因为 F_{i+1} 是极大生成树,从而 E_{i+1} 中一定要有跨越两个集合的边,而我们删去这条边之后 |W-e|=i-1 依然是 G_i 的一个割,和 \lambda(x, y; G_i)=i 矛盾
Procedure FOREST
接下来就要快速找出这样的一种分解方案了
一个显然的做法是求 k 次生成树,复杂度 O(k|E|)
稍微聪明一点的做法可以每次考虑加入一条边,然后把它放到第一个让他不连通的 E_i 里,由拟阵的性质正确性显然。
如果我们用并查集维护,每次二分第一个不连通的集合,复杂度 O(|E|logk)
但是如果我们做的再聪明一点其实可以一次扫描,在线性的复杂度内,求出这个分解。
我们对于每个点 x ,定义 r_x 为它相连的边中 max_e\{i|e \in E_i\}
然后我们每次找到 r_x 最大的一个点 x ,考虑它的每个出边 (x,y) ,我们可以证明它应该属于边集 E_{r_y+1} 。
证明如下:
首先在此时的 E_{r_y+1} 中, y 的度数为0,所以一定不会出现环。
所以证明重点在于证明此时 E_{r_y} 中 x 和 y 连通
考虑我们可以把扫描的时候处理到的边 (x,y) 规定方向为 x\rightarrow y ,那么以点被扫描的顺序作为拓扑序,整个图构成了一个DAG。同时对于 E_i ,因为在边加入的时候总是满足 d(y)=0 ,所以每个连通分量都构成了一个外向树,除了第一条边的起点是根之外,每个点入度为1。
我们先不管 r_x \geq r_y ,把 x 和 y 当做对称的。
假设 E_{i=\min\{r_x,r_y\}} 中不存在一条连接两点的路径。那么 E_i 中两点分别属于两个外向树,假设 x 的根为 x_0 , y 的根为 y_0 ,因为对称性,可以不失一般性的假设 x_0 先于 y_0 被访问到。
那么此时由于 x_0 和 y_0 是 E_i 中的根, r_{y_0} \leq i-1 ,并且在处理 y_0 之前这个不等式始终成立。同时我们先处理了 x_0 ,在处理完之后,因为加入了 E_i 中的边, r_{x_1}=i ,然后我们会在 y_0 之前处理 x_1 (因为 r_{x_1}>r_{y_0} ),同理就可以得到会在 y_0 之前处理 x_2 ,直到会在 y_0 之前处理 x 。
那么处理完 x 之后就必须得在 y_0 之前处理 y 了,和 y_0 是 y 的根矛盾了。
一些性质
FOREST 跑出来的分解满足这样的性质:
当 k 小于等于 G 中的最小度数时, G_k 中会有一个点度数恰好为 k 。
只需要考虑最后一个访问到的点,连到它的边假设有 d 条,显然会在 E_1 到 E_d 中。
吐槽
知乎这个公式好像并不支持直接$$x$$的格式,在我在markdown编辑器里写完复制上来,发现必须要用知乎的公式编辑器的时候...我的内心是崩溃的。最后花了我将近20分钟来用公式编辑器输入每个公式。