图论连通性算法简记

广义串并联图方法

广义串并联图

定义一:不同胚于 \(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 边三连通分量

就是板子。

posted @ 2026-06-08 21:20  LastKismet  阅读(11)  评论(0)    收藏  举报