图论连通性算法简记
广义串并联图方法
广义串并联图
定义一:不同胚于 \(K_4\) 的图。
定义二:可以用广义串并联图方法缩成单点的图。实现上显然更容易用此方法判定。
然后有两个不一定有用的小性质:
- 是平面图。
- \(|E|\le 2|V|\)。
广义串并联图方法
方法
简单来说就是删一度点、缩二度点、叠合重边。
也就是对无向图重复执行以下三种操作直到不存在符合条件的点:
- 删一度点:删除度数为 \(1\) 的点。
- 缩二度点:对于度数为 \(2\) 的点 \(u\),设其两条邻边为 \((u,v),(u,w)\),删除 \(u\) 并连边 \((v,w)\)。
- 叠合重边:把重边缩成一条边。
应用
对于广义串并联图,我们可以在边上维护一些信息,然后执行广义串并联图方法,合并边的时候合并信息,删除边的时候将其信息更新给答案或相应点,最终即可得到答案。具体看例题即可。
然后对于一般图,一个性质是若 \(|E|\le |V|+k\),执行完广义串并联图方法后满足 \(|V'|\le2k\land|E'|\le3k\),可能可以考虑对新图跑暴力得到答案。
例题
P6790 [SNOI2020] 生成树
给定的是广义串并联图,直接跑广义串并联图方法即可。
P10779 BZOJ4316 小 C 的独立集
同理,不过删边之后要更新到相应点权上。
ABC419G Count Simple Paths 2
发现特殊限制,考虑执行方法之后直接跑暴力。
耳分解
耳
对于无向图 \(G=(V,E)\) 及其子图 \(G'=(V',E')\),定义耳为路径 \((v_1,\dots,v_k)\) 满足 \(v_1,v_k\in V'\land v_{\forall i\in(1,k)}\not\in V'\) 且 \(v_{2}\dots v_{k-1}\) 互不相同,若 \(v_1\ne v_k\) 则称之为开耳。
耳分解
将一个无向图分解成多个耳。更准确地,从一个单点或简单环开始,不断找到耳加入 \(G'\),直到 \(G'=G\)。类似地可以定义开耳分解。
无向图存在耳分解当且仅当边双连通。
- 必要性:若存在割边,你考虑无论当前 \(G'\) 在哪一侧,都找不出耳将割边加入 \(G'\)。
- 充分性:构造证明,我们找出 DFS 树,然后每次找一个自己不在 \(G'\) 但是自己的 \(low\) 指针点在 \(G'\) 内,将他的最浅的不在 \(G'\) 内的祖先走树上边到他再跳到 \(low\) 的耳加入 \(G'\),因为是边双所以必然可行。
无向图存在开耳分解当且仅当点双连通。证明类似。
应用
耳分解本身其实挺难做出花来。不过其存在一个在有向图上的推广:
首先考虑一个 naive 的问题,给无向图定向使其强连通,显然只需要耳分解即可。
那么,对于有向强连通图,我们用类似于无向图的方法可以对其执行耳分解,耳的定义拓展为路径上边方向一致。
例题
P5776 [SNOI2013] Quare
简单状压执行耳分解即可。
GYM102759C Economic One-way Roads
与上一题本质相同,不过进行了加强,需要考虑逐点更新答案。
双极定向
定义
对于一个无向图 \(G\),我们类似于网络流地设定源点和汇点 \(s,t\),然后给边定向生成 DAG,使得 \(s\) 可以到达所有点且所有点可以到达 \(t\),只有 \(s\) 无入边、只有 \(t\) 无出边。
可以双极定向等价于:
- 加入无向边 \((s,t)\),图点双连通。容易反证。
- \(G\) 的圆方树中所有方点成链状,且路径 \((s,t)\) 为一条直径。容易由上一条得到。
- 存在对所有点的排列,满足任意前缀、任意后缀内点连通。定向后拓扑序就是。
构造方案
首先一个性质是,对于可以双极定向的图,是容易缩掉其二度点的。
其次,考虑 DFS 生成树,那么每个点只需要保留最浅的返祖边及 \(low\) 即可,其余返祖边可以在最后通过单独的耳加进来。
那么存在一个构造方案就是,以 \(s\) 为根建 DFS 生成树,先找出 \(s\to t\) 的路径,然后对于非路径上点,每次找一个叶子,只考虑它的 \(low\) 和父边情况下其显然为二度点,于是直接缩掉。这是一个递归构造方案,但是不太好写。
事实上有更简单的实现方法方法,我们在上述算法前提上进行优化。具体的,我们对每个点额外维护一个序列,然后按照剥叶子的顺序向非 \(s\to t\) 上点的 \(fa\) 和 \(low\) 的序列中推入它自己,最后将序列视作有序出边集合跑深搜染色,按染色先后顺序排列点即可得到等价条件三的排列,再给边定向是容易的。
例题
CODECHEF CUREK Curing Kingdom
你发现树是简单的,你发现点双是容易双极定向做的,你发现搞出圆方树就可以把两个算法拼起来了。
P9394 白鹭兰
搞出圆方树,然后利用等价条件二找链,跑树上 DP 即可。
P5811 [IOI 2019] 景点划分
据说存在双极定向做法,但我不会。
割集判定
割集
极小的边集满足删除后原无向图不连通。
实现
我们跑出一棵 DFS 生成树,给非树边随机赋权,然后给树边权值设为覆盖它的非树边边权异或和,那么割集的充要条件为集合边权异或和为零。
证明考虑反证,若异或和为零但连通,考虑割集中必然有树边,找到最浅的一条,因为连通所以必然有非树边连接其上下两部分,然而非树边没有贡献,要么它也在割集里,要么非树边还包含了当前边以下的另一条树边,两种都会导致图不连通,矛盾得证。割集异或和必然为零也是容易讨论的。
例题
P10778 BZOJ3569 DZY Loves Chinese II
有上述结论就很简单,跑线性基即可。
边三连通分量判定
判定
定义就不写了。考虑就是要满足不存在大小不超过 \(2\) 的割集,容易反向找相应割集,同样拉出 DFS 生成树则只有三种情况:
- 一条边为割边。
- 一条树上边和一条非树边权值相等。
- 两条树上边权值相等。
对三种情况中的树上边执行子树随机异或(情况三两条边异或同一值),最后权值相等的就在一个边三连通分量里。
特别地,对于情况三,首先这些边必然在一条链上,其次我们只需要对其两两相邻边对执行操作即可,DFS 过程中动态维护哈希表容易实现。
例题
P6658 边三连通分量
就是板子。

浙公网安备 33010602011771号