双连通 / 圆方树 胡扯笔记
懒得写很详细了,算逑!凭空整理出一套理论体系,包括各种定义、定理、性质、证明,不是我所能做到的事情。自己懂了就行了!就随便抛一些结论,都不难证明(如果你善于使用前面的结论的话)。
以下全部在无向连通图上讨论。因为下列理论对不同的连通分量是独立的。
割边 / 割点
删一条边使图不连通,称为割边。删点不连通称割点。
一条边是割边当且仅当不在任何环上。
tarjan 求之!
考虑 dfs 树,那么原图中只有树枝边和返祖边。设 \(dfn_i\) 为 \(i\) 的时间戳,追溯值 \(low_i\) 为子树 \(i\) 通过返祖边一步到的点集并上 \(i\) 的最小时间戳。
显然只有树枝边才可能是割边,树枝边 \((x,y)\)(其中 \(x\) 是父亲)是割边当且仅当 \(dfn_x<low_y\)。对非根点 \(x\),\(x\) 是割点当且仅当存在儿子 \(y\) 使 \(dfn_x\leq low_y\);对根则要求有两个 \(y\)。用「子树自闭」的方式轻松证明。
dfs,一路更新 \(low\),用上述法则判断割边、割点,此 tarjan 算法也。一个小坑:有重边的话,只有一条算树枝边,其它都算返祖边——这对割边判定有影响,对割点无影响(嘿嘿!)。
双连通
边双连通(比较简单)
删一条边使 \(x,y\) 不连通,则称 \(x,y\) 的必经边。若 \(x,y\) 不存在必经边,称边双连通。对 \(x\neq y\),显然 \(x,y\) 边双连通当且仅当它们在同一个环(不要求是简单环)上,亦即存在两条无交边的 \(x\to y\) 路径。
边双连通自反性、对称性显然,传递性易证,所以是等价关系,可以把整个点集划分成若干个等价类。
对 \(x,y\),随便找一条 \(x\to y\) 路径,上面的割边集合和必经边集合相等。边两端不边双连通当且仅当这条边是整个图的割边。
一个图边双连通,当且仅当其中任意两点都边双连通,亦即不存在割边,又即所有边都在某个环上。
一个图的边双连通分量(简称 e-DCC、边双)为其极大边双连通子图,显然按边双连通性划分的所有等价类就是所有边双。把所有割边删除之后的连通分量就是原图的边双,可以按这个方法 dfs 求所有边双。有且仅有非割边属于某个边双。
边双缩点
把每个边双看成点,之间有边(最多只有一条边)的连边。根据连通性和无环性,得到一棵树,这就是原图的边双缩点。里面的边是原图里的所有割边。
两个点的必经边集合是它们所在边双在树中的点之间的简单路径。
点双连通(有点复杂)
换个角度,考虑定义边之间的点双连通性(对点考虑边双,对边考虑点双,岂不完美?)。先定义从一条边到另一条边的过程是从前者的中点走到后者的中点。然后类似地定义边的必经点、点双连通性。对两条边互异的边,可以证明它们点双连通当且仅当有两条没有交点的路径,亦即它们在同一个简单环中。
边的点双连通的自反性对称性显然,传递性易证,所以是等价关系,可以把整个边集划分成若干个等价类,又同时是所有极大点双连通边集。
两条边之间随便一条路径上的割点集合就是必经点集合。仅有一个公共点(这里考虑到了重边。但事实上点双中重边完全可以看作一条边)的两条边点双连通当且仅当公共点不是割点。
再定义点的必经点:异于两点的删除之后就会不连通的点。类似定义点的点双连通性。点的点双连通自反性对称性仍然是有的,但遗憾的是没有传递性,所以不得不借助边的点双连通来研究。
对不相邻的点,两点点双连通当且仅当存在两条除端点以外没有交点的路径,亦即在同一个简单环上;相邻的点永远点双连通。
两点点双连通当且仅当存在一条由全部点双连通的边构成的路径。那么类似定义点双连通图、点双连通分量(v-DCC、点双),知道所有极大点双连通边集的边诱导子图是所有点双(孤立点另谈!)。图点双连通当且仅当没有割点。除原图为孤立点的情况,显然所有点双大小至少为 \(2\)。
那怎么求点双。需要用极大点双连通边集来搞。这里可以点变成边,边变成点然后 dfs,其中原图有公共点的边在新图中作为相邻点。但是一个菊花就卡爆了。一个更快的算法是改进版 tarjan。维护一个栈,访问时压入,对每条满足 \(dfn_x\leq low_y\) 的边 \((x,y)\)(不管 \(x\) 是否根)一直弹出栈顶直到最后一个弹出的是 \(y\),弹出的这些点和 \(x\) 一起构成一个点双(孤立点特判!)。
显然所有边属于恰好一个点双,非割点恰好属于一个点双,割点同时属于多个点双,作为其中每对点双的唯一公共点。
圆方树
点双缩点稍复杂,称为圆方树。令圆点代表原图中的点,方点代表点双(数组要开两倍!!),一个方点跟其代表的点双中所有点代表的圆点连边,通过连通性无环性可证是棵树。这里面圆方交错,方点(除孤立点)、割点都不是叶子,非割点都是叶子。
这是无根树,一般习惯以原点为根。除孤立点,一定是一层圆、一层方、……一共奇数层,最后一层是圆点。
如何求边所在点双?它两端显然在同一个点双中,在圆方树中距离为 \(2\)(除自环),分类就可 \(\mathrm O(1)\)。
点的必经点集合是对应圆点在圆方树上的路径上的圆点集合。边的必经点集合是所在点双对应方点在圆方树上的路径上的圆点集合。
割掉一个圆点,圆方树的分裂情况与原图一致。
放一张好康的圆方树图片!