连通性相关

连通性相关

强连通分量

有向强连通图:任意两个点可以互相到达。

强连通分量(SCC):极大的强连通子图。

Tarjan 算法

维护一个栈存储搜索到的还未确定强连通分量的点,定义:

  • dfnu :节点 u 被搜索的次序。
  • lowuu 子树中能回溯到的最小的 dfn

不难得到:

  • 一个点子树内的 dfn 大于该点的 dfn
  • 从根开始的路径上的 dfn 递增,low 非降。

对于 u 的出点 v ,分类讨论:

  • v 未被访问过:继续 dfs ,并用 lowv 更新 lowu 。因为存在 uv ,所以 v 可以直接回溯到已在栈中的点 u 一定可以回溯到。

  • v 被访问过

    • 已在栈中:根据 low 的定义,用 dfnv 更新 lowu

    • 不在栈中:说明 v 已搜索完毕,其所在的连通分量已被处理,不用管它。

对于一个强连通分量,不难发现只有一个 u 满足 dfnu=lowu ,其一定是这个强连通分量的根。

因此回溯过程中,若 dfnu=lowu ,则新增一个强连通分量。

对于一张有向图,其可能存在环。可以将每个强连通分量分别缩成一个点,这个图就会变成一张 DAG,可能会便于处理。

Kosaraju 算法

  • 第一次 dfs:遍历所有点并在回溯时入栈。
  • 第二次 dfs:在反图上依次从栈顶开始 dfs ,此时遍历到的点集就是一个强连通分量。

时间复杂度 O(n+m)

bitset 优化可以做到 O(n2ω) 的复杂度。

应用

BZOJ5218 省队十连测 友好城市

给出一张有向图,q 次询问仅保留编号属于 [li,ri] 的边时有多少无序对城市满足可以两两到达。

n150,m3×105,q5×104

注意到 n 很小,使用 Kosaraju 配合莫队即可,时间复杂度 O((mlogm+q)n2ω+qm)

CF1515G Phoenix and Odometers

给定一张带边权的有向图,q 次询问,每次给定 v,s,t ,询问时候存在一条经过 v 的回路满足长度与 s 在模 t 意义下同余。

n,m,q2×105

首先不难发现每个 SCC 的答案是一致的,且不同 SCC 之间相互独立,故考虑对于每个 SCC 分开计算。

假设经过 u 有两个长度为 ab 的环,那么就相当于找两个非负整数 xy,使得 ax+by=w,其中 w 为题中的路径长,根据裴蜀定理得到上述方程成立当且仅当 gcd(a,b)w

考虑如何求出经过点 u 的所有环长度的 gcd 。通过分析发现,所有的非树边 uv 对答案的贡献都是 disu+wdisv 。于是搜索时顺便记录贡献即可。

CF1361E James and the Chase

给定一张有向强连通图。一个点是好的当且仅当它到其它点有且只有一条简单路径。如果好的点至少有 20% ,则输出所有好的点, 否则输出 1

n105m2×105

考虑如何判定 u 是好的。只要以 u 为根建出 dfs 树,若无横叉边或前向边则 u 即为好的。于是可以做到 O(n) 的判定。

接下来考虑确定一个好节点 u 后求出其余好节点。以 u 为根建立 dfs 树,考虑某个 v 的子树,由于整个图的强连通性,v 的子树中有连向其祖先的返祖边。不难发现这样的边有且仅有一条,否则 v 有两条路径可以到 fav

那么先把所有子树 v 内返祖到根的祖先的边的数量记录下来,如果数量 2v 不为好点,否则就顺便记录每个 v 子树的那条返祖边指向的点。

假设 v 的子树这条返祖边指向了 w,那么 v 是好点,当且仅当 w 是好点。

于是一个点 v 是好点,当且仅当 v 的子树内有且仅有一条连向 v 的祖先的返祖边,并且这条边所连向的点是好点。

第一个条件可以考虑所有返祖边 (a,b),它对哪些 v 的子树内返向 v 祖先的边的数量的有贡献。显然这样的 v 分布在 afaa...sonb 上,这里的 sonbb 的儿子节点中靠近 a 侧的那个,树上差分即可和第二个条件一起解决。

于是可以在已知一个好点的情况下线性求出所有好点。

考虑随机选取一定数量的点进行上述算法流程,若均不满足条件则输出 1 ,注意随机取点不要取重。

2-SAT

2-SAT 问题:给定一串布尔变量,每个变量只能为真或假。要求对这些变量进行赋值,满足布尔方程。

实现

构造状态

点的状态:将点 u​​ 拆分成 u0,u1​ 两个点,分别表示 u​ 点为假、真。

边的状态:若连的边为 uv ,就表示选择 u 就必须选 v

判断有无解

由所构造的状态可知,对于图中的每一个强连通分量,如果选择了其中任意一个点,那就意味着这个强连通分量中的所有点都要选。显然 x0,x1​​ 不可以同时选,由此可判断有无解。

方案输出

由连边的方式可以得知,我们对于每个点的两种状态,选择拓扑序大的,舍弃掉另一个。

注意到用 Tarjan 求得的强连通分量编号就是反拓扑序,于是选择强连通分量编号较小的点即可。

如果要求字典序最小,就深搜枚举点 12n ,贪心选取。

P4782 【模板】2-SAT 问题

应用

P3825 [NOI2017] 游戏

给定一串序列,有 dx 位置有三种选择,其他位置有两种选择,求解一种合法方案。

n5×104,d8

暴力枚举每个 x 地图不填 A 或不填 B 。因为不填 A 就可以填 B,C ,不填 B 就可以填 A,C ,这样就包含了 A,B,C 三种赛车。

时间复杂度降为 O((n+m)×2d)​ 。

[ARC161E] Not Dyed by Majority (Cubic Graph)

给出每个点的度数恰为 3 的无向图。一次操作为将每个点的颜色变为所有邻居颜色的众数。构造黑白颜色序列使得无论如何染色,操作后都不可能变为该颜色序列。

n5×104 ,保证 n 为偶数

考虑如何判定一个颜色序列是否可作为操作后的颜色序列。

设操作前的颜色序列为 ai(不妨使 ai=0,1 代表黑和白),操作后的颜色序列为 bi 。对于点 iei,j 为与 i 相邻的三个点。

对每个 i 有两种情况:

  • bi=0:则对 jk,若 aei,j=1aei,k=0
  • bi=1:则对 jk,若 aei,j=0aei,k=1

这是一个关于 ai,有 6n 个条件的 2-SAT 问题,可以 O(n) 解决,目标转化为找到一个方案使得 2-SAT 问题无解。

考虑 1 的邻域 x,y,z,以及他们的邻域 {1,x0,x1},{1,y0,y1},{1,z0,z1} ,若 dx0=dx1,dy0=dy1,dz0=dz1 ,那么无论 d1 是什么,答案都不会更改。因此至少有 116 的序列会互相重复,那么期望 O(1) 次随机后能得到一组解。

滈葕

给定一张边权为 01 的有向图,给每个点赋予 A/B/C/D 的一个字母,使得每条有向边边权为 1(au,av){(A,D),(A,B),(B,D),(B,A),(C,D),(C,A),(C,B)} 的充要条件。

n105m5×105

考虑令 A=01,B=10,C=11,D=11 ,于是每一条 1 的边都对应了存在某一位 u>v 。考虑如何表示为 2-SAT 的限制:

  • w=0 :对于每一位 u 都不大于 v
    • u 的某一位是 1 ,则 v 的相应位必须是 1
    • v 的某一位是 0 ,则 u 的相应位必须是 0
  • w=1 :存在每一位 u 大于 v
    • u 的某一位是 0 ,则 u 的另一位必须是 1 ,且 v 的另一位必须是 0
    • v 的某一位是 1 ,则 v 的另一位必须是 0 ,且 u 的另一位必须是 1

时间复杂度 O(n)

割点

定义:对于一个无向图,若把一个点删除后这个图的极大连通分量增加了,则这个点就是图的一个割点。

特判根节点。对于非根节点,若存在一个儿子点 v 使得 lowvdfnu (即不能回到祖先),则该点为割点。

P3388 【模板】割点(割顶)

桥(割边)

定义:对于一个无向图,若把一条边删除后这个图的极大连通分量增加了,则这条边就是图的一个桥。

代码和割点差不多,只要改一处: lowv>dfnu ,而且不用特判根节点。

边双连通

  • 边双连通:无向图中对于两点 u,v ,若满足删去任意边两点均连通,则称 u,v 边双连通。
  • 边双连通分量:不存在割边的极大连通块。

求解

遍历时不走割边即可求得边双。

也可以用栈维护 dfs 到的所有点,每次找到割边 (fa,son) 就不断弹栈直到弹出 son ,则弹出的所有点是一个边双。

P8436 【模板】边双连通分量

相关结论

  • 边双对点有传递性。
  • 每个点恰属于一个边双。
  • 对于边双内任意一条边 e ,存在经过 e 的回路。
  • 对于边双内任意两点 u,v ,存在经过 u,v 的简单环。
  • 两点之间任意一条迹(不经过重复边的路径)上的所有割边,就是两点之间的所有必经边。
  • u,v 边双连通当且仅当 u,v 间无必经边。
  • 边双可以赋方向后可以变成 SCC。
  • 边双缩点完是一棵树/森林。

应用

P4652 [CEOI2017] One-Way Streets

给定一张 n 个点 m 条边的无向图,现在想要把这张图定向。

q 个限制条件,每个条件形如 (xi,yi),表示在新的有向图当中,xi 要能够沿着一些边走到 yi

现在请你求出,每条边的方向是否能够唯一确定。同时请给出这些能够唯一确定的边的方向。数据保证有解。

n,m,q105

由于边双可以赋方向后可以变成 SCC,那么反向后仍然是 SCC,因此一个边双内的边的方向都是无法确定的。

将边双缩点,构建出一棵树,那么一个限制就是树上定向一条路径,不难用树上差分解决。

CF475E Strongly Connected City 2

给一个无向连通图,需要给所有边定向,最大化满足 a 能到达 b 的点对 (a,b) 数量。

n2000

由于边双可以赋方向后可以变成 SCC,于是考虑把先把边双缩点成树。

可以发现最优方案一定是确定根之后,一部分子树都是叶向边,剩下的子树都是父向边,并且这两部分的大小要尽可能接近。

直接枚举根做 bitset 优化背包即可做到 O(n+m+n2ω)

CF51F Caterpillar

一个无向连通无环图是毛毛虫当且仅当图上存在一条路径 P 使得任意点与 P 的距离至多为 1 ,要求 P 不能有重边。

给出一张无向图,一次操作可以将两个点合并(出边也合并),求将其变成毛毛虫的最少操作次数。

n2000m105

由于毛毛虫无环,因此先对整张图按边双缩点转化为森林。

对于一棵树,最优的毛毛虫显然就是去掉叶子之后的直径,因为叶子可以变成一条链上挂的点,剩下的最长链显然就是直径。

时间复杂度 O(n+m)

CF855G Harry Vs Voldemort

给出一棵树,q 次增加一条无向边的操作,每次求有多少个三元组 (u,v,w) ,满足 P(uw)P(vw)= ,其中 P 表示一条路径的边集。

n,q105

考虑缩完边双的树,枚举 w 为根,则满足条件的 (u,v,w) 必然满足 uv 不在 w 的同一子树内。定一个根之后,一个 w 的贡献就是 n2(nsw)2vson(w)sv2 ,其中 su 表示 u 的带权子树大小。

接下来考虑处理加边的情况,考虑用并查集维护边双,一个点指向每个边双深度最小的节点,每次暴力向上跳父亲合并边双,同时维护 s 和子树的 s2 即可。

P8867 [NOIP2022] 建造军营

给出一张无向连通图,求有多少选出至少一个点组成点集 V 和任意数量边组成边集 E 的方案,满足对于任意 eEE 满足删去 eV 仍连通。

n5×105m106

先将边双缩点,变成一棵树。则选出的点集在树上组成的极小连通块的树边必须选,剩下的边无所谓。

于是可以树形 DP,设 fu,0/1 表示 u 子树是否选点的方案数,若选点则必须通过选树边与 u 连通。考虑转移,有:

fu,1fu,0×fv,1+fu,1×(2fv,0+fv,1)fu,0fu,0×2fv,0

接下来考虑统计答案,每个点集连通块在 LCA (记为 u )处统计,钦定 u 连父亲的边不能选(否则会在父亲再统计一次),则令 ansfu,1×2mse(u)1 ,其中 se(u) 表示 u 子树内的边数,对根特殊处理 ansfr,1 即可。

两条

给出一张无向图,q 次操作:

  • 1 k :删除第 k 条边。
  • 2 u v :查询 u,v 之间是否存在两条边不相交路径。

n8×105m,q106

考虑时光倒流,则每次都是加入一条边。若能求出整个图的一棵生成树,则每次可以用并查集缩边双。

考虑求出一棵生成树,用并查集维护,先将始终存在的边加入,然后倒序枚举,若枚举到的边会合并两个连通块,则说明其为一条割边,删除或存在不影响答案,因此也将其加入。

总时间复杂度 O(n)

点双连通

  • 点双连通:无向图中对于两点 u,v ,若满足删去任意除这两点以外的点两点均连通,则称 u,v 点双连通。
  • 点双连通分量:不存在割点的极大连通块。

求解

每次判定 lowvdfnu 时,v 子树栈内的点与 u 共同构成一个点双,需要特判一下孤立点的情况。

P8435 【模板】点双连通分量

相关结论

  • 点双对点不具有传递性。
  • 每条边恰属于一个点双。
  • 一个点是割点当且仅当它属于多个点双。
  • 由一条边直接相连的两个点点双连通。
  • 对于点双内的任意点 u ,存在经过 u 的简单环。
  • n3 时,在边中间插入点不影响点双连通性,因此钦定经过一个点和经过一条边是几乎等价的。
  • n3 的点双中任意点 u 与任意边 e ,存在经过 u,e 的简单环。
  • n3 的点双中任意不同两点 u,v 与任意边 e ,存在 uev 的简单路径。
  • n3 的点双中任意不同三点 u,v,w ,存在 uvw 的简单路径。
  • 两点之间任意一条路径上的所有割点,就是两点之间的所有必经点。
  • 若两点双有交,那么交点一定是割点。

应用

P8456 「SWTR-8」地地铁铁

给定边权为 01 的无向连通图,求有多少组点对之间存在同时经过 01 的简单路径。

n4×105m106

对于落在不同点双的点对,如果经过的点双包含 0 边和 1 边则合法,否则显然不合法。

对于落在相同点双的点对,如果点双内部边权相同,显然不合法,否则若存在唯二既有 0 出边又有 1 出边的点对,则该点对不合法,其他合法。

圆方树

此处定义点双为不存在割点的极大联通分量。这与点双的原始定义只在两个点一条边时有区别。

在圆方树中,原来的每个点对应一个圆点,每一个点双对应一个方点。所以共有 n+c 个点,其中 n 是原图点数,c 是原图点双连通分量的个数。

而对于每一个点双,它对应的方点向这个点双中的每个点连边。每个点双形成一个菊花图,多个菊花图通过原图中的割点连接在一起(因为点双的分隔点是割点)。

显然,圆方树中每条边连接一个圆点和一个方点。

圆方树的点数小于 2n ,一定要开两倍空间。

只有当原图连通的情况下圆方树才是树。

构建

考虑 Tarjan 算法。不难发现对于一条边 uvu,v 在同一个点双中且 u 是该点双中深度最浅的节点当且仅当 lowv=dfnu 。类似 Tarjan 求割点的方式构建圆方树即可。

应用

P4630 [APIO2018] 铁人两项

给定一张简单无向图,求有多少对三元组 (s,c,f) 满足 s,c,f 互异且存在一条简单路径从 s 出发经过 c 到达 f

n105

首先不难发现,若经过一个点双(至少两个点),则可以到达该点双中的任意点再走出来。

考虑构建圆方树,对于一对 s,f ,合法的 c 就是 sf 路径上所有圆点和方点连的圆点,再去掉 s,f

令圆点权值为 1 (因为会被路径上相邻两个方点统计两次),方点权值为点双大小,则一对 s,f 的贡献就是树上路径权值和。不难树上换根 DP 处理,时间复杂度 O(n+m)

CF487E Tourists

给定一张简单无向连通图,点有点权 wi ,要求支持两种操作:

  • 修改一个点的点权。
  • 询问两点之间所有简单路径上点权的最小值。

n,m,q105

发现一个点双对答案的贡献为点双里面的最小权值。构建圆方树,方点的权值为点双中的最小圆点权值。然后原图就变成了一棵树,询问时就可以直接树剖套线段树求路径最小值了。

一次修改一个圆点的点权,需要修改所有和它相邻的方点,这样很容易被卡到 O(n) 个修改。树上邻域修改的一个技巧是整体维护儿子,单独维护父亲。考虑令方点权值为自己的儿子圆点的权值最小值,这样的话修改时只需要修改父亲方点。对于方点的维护,只需要对每个方点开一个 multiset 维护权值集合即可。

需要注意的是查询时若 LCA 是方点,则还需要查 LCA 的父亲圆点的权值。

时间复杂度 O(qlog2n)

P4606 [SDOI2018] 战略游戏

给定一张无向图,每次给出一个点集 S ,求有多少个点 u 满足 uS 且删掉点 uS 中的点不连通。

n,q105

先建出圆方树,则变为询问 S 在圆方树上对应的连通子图中的不在 S 中的圆点个数。

记每个圆点和父亲方点的边权为 1 ,则问题转化为 S 在圆方树上对应的极小连通子树的边权和,答案即为 dfn 相邻点距离和的一半。

注意要答案要减去 |S| ,且若子图中的深度最浅的节点是圆点,答案还要加上 1

弱化版(|S|=2):P4320 道路相遇

CF1763F Edge Queries

给定一张无向图,q 次询问,每次给出点对 (s,t) ,求有多少条能出现在 st 简单路径上的边满足删去后 st 仍连通。

n,m,q2×105

构建圆方树,对于路径上的方点,若该方点表示的点双不为两点一边,则整个点双中的所有边都合法。

问题转化为树上路径求点权和,不难用树剖做到 O(qlogn)

P9167 [省选联考 2023] 城市建造

给定一张 n 个点 m 条边的无向连通图 G=(V,E),询问有多少该图的子图 G=(V,E) 满足:

  • E
  • GE 中恰有 |V| 个连通块。
  • GE 中任意两个连通块大小之差不超过 k

答案对 998244353 取模。

3n105n1m2×1050k1

由于 GE 恰有 |V| 个连通块,故 V 中的每个点在 GE 分别属于不同的连通块,且仅通过 E 使得 V 连通。

对于选择的两个点,若存在一条简单路径连接它们,则路径上的每个点都要选择,否则这两个点在 GE 中连通。

进一步的,若一个点双里面选了两个点,则整个点双都要选。

建出圆方树,称删去一个方点表示选其所有邻域圆点,则删去的方点通过圆点直接构成一个连通块。

考虑第三条限制,删去选择的方点后,每个连通块大小(圆点数量)相差不超过 k

先考虑 k=0 的情况,则连通块大小 dn 的因数。考虑枚举连通块大小 d ,统计方案数。

以带权重心 R 为根,若 R 为方点则令其相邻圆点为 R 。令圆点权值为 1 ,方点权值为 0sizi 表示 i 子树内的权值和。分类讨论每个方点 u 是否被删去:

  • sizu<d :不删 u
  • sizu>d :删去 u
  • sizu=d :若 u 只有一个儿子则删去 u ,否则不删 u

再判断一下该方案的合法性即可,可以在线维护 cnti 表示大小为 i 的连通块数量。

从小到大枚举 d ,用并查集维护即可做到 O(nα(n))

再考虑 k=1 的情况,可以容斥,用连通块大小为 dd+1 的方案数,然后减去连通块大小为 d 的方案数,再减去连通块大小为 d+1 的方案数。

对于 sizd 的情况,按照 k=0 的方法处理即可。

否则考虑一个圆点所有 siz=d 的方点儿子,显然这些方点最多保留一个。先钦定删去所有 siz=d 的点,此时若一个方点的父亲圆点所在连通块大小 >1 ,则其所有 siz=d 的儿子都必须删,否则只能保留任意一个。即对于所有存在 siz=d 的方点儿子的圆点,若其满足所在连通块大小为 1 ,则将方案数乘上 siz=d 的方点儿子数量。

注意在 d=1 时一个圆点的所有 siz=d=1 的方点儿子可以都删去,也可以保留一个,因为该圆点的父亲必然被删去,若不保留则儿子方点连通块大小都为 1 ,若保留一个则该点连通块大小为 2 。因此答案要乘上其 siz=1 的方点儿子的数量 +1

同样使用并查集维护即可做到 O(nα(n))

本文作者:wshcl

本文链接:https://www.cnblogs.com/wshcl/p/18306858/connectivity

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wshcl  阅读(42)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开