2026.7.14 连通性问题
[中山市选] 杀人游戏
询问一个点显然可以得出其所在 scc 的所有点,因此缩点。
缩点后应该询问所有入度为 \(0\) 的点,因为入度不为 \(0\) 的点可以通过入度为 \(0\) 的点推出。那么记入度为 \(0\) 的点有 \(m\) 个,一般情况下答案为 \(\dfrac{n-m}{n}\)。
还有一种 corner case:考虑排除法。若存在一个 scc 的大小为 \(1\),且我们不需要通过它来推断别的 scc(即其指向的所有 scc 入度大于 \(1\)),则答案为 \(\dfrac{n-m+1}{n}\)。
时间复杂度 \(O(n+m)\)。
App 管理器
待补。
[HNOI2010] 平面图判定
思考题目给出的哈密顿环有什么用。
将图放在平面上,每条不在环上的边只有两种选择:放在环内或放在环外。并且要求放在环内和环外的边分别不交。那么我们给相交的边之间连一条边,判定其是否是二分图即可。
使用平面图边数至多为 \(3n-6\) 的结论可降低复杂度至 \(O(n^2)\)。
[NOI2017] 游戏
观察到 \(d\) 只有 \(8\),尝试暴力。
若枚举所有 \(\texttt{x}\) 填什么,则复杂度会来到 \(O(3^d(n+m))\),无法接受。不妨枚举 \(\texttt{x}\) 不填什么,这样只需要枚举不填 \(\texttt{a}\) 与不填 \(\texttt{b}\) 即可覆盖所有情况,搜完后跑 2-SAT 即可。时间复杂度 \(O(2^d(n+m))\)。
Strongly Connected City 2
考虑一个 scc 内部的点是能够互相到达的,我们希望让每个 scc 尽可能的大。考虑原图的每个 edcc,我们拉出一棵 dfs 生成树,树边定正向,返祖边定反向,即可得到一个 scc。同时不在一个 edcc 中的点显然不可能强连通,因此我们可以将原图线按边双连通缩点,这样仅需考虑树上边双与边双之间的问题。
问题转化为给树边定向,最大化可达点数之和。
考虑贡献的形式。假设树为一条链,若出现了路径 \(u_1 \to \dots \to u_2 \leftarrow \dots \leftarrow u_3 \to \dots \to u_4\),则我们设 \(u_2\) 可达 \(a\) 个点,有 \(b\) 个点可达 \(u_3\)。若 \(a<b\),则我们可以反转 \(u_1 \sim u_2\) 的边,这样能被 \(u_2\) 抵达的点无法再抵达,但是 \(u_1 \sim u_2\) 的点均能被能抵达 \(u_3\) 的点抵达,因此答案至少增加 \((b-a)cnt_{u_1 \sim u_2}\),反之同理。由于反转一个 scc 内部的边并不影响答案,因此这样调整过后可以让答案增加。
将链替换为树则是同理的,可以将贡献形式中的链替换为一个 scc 考虑。因此可以找到一个点 \(u\),使得以 \(u\) 为根时,所有 \(u\) 到叶子的路径上的边要么均是指向根,要么均是指向叶。
那么假设固定了点 \(u\),记 \(u\) 的所有儿子集合为 \(S\),我们需要找到一个 \(T \subseteq S\),令其内部的边为根向,其余为叶向,去掉根的贡献后(这显然是定值)这样的定向方案答案是 \(\left(\sum\limits_{x \in T} sz_x \right)\left(\sum\limits_{x \not \in x} sz_x\right)\)。根据数学知识,这等价于找到一个和 \(\le \dfrac{n}{2}\) 的且最大的集合。使用 01 背包即可。
枚举根,复杂度为 \(O(n \sum d_i)=O(n^2)\)。但是这也太不优雅了,考虑答案有什么性质。
假设 \(u\) 有一个大小 \(> \dfrac{n}{2}\) 的子树,那么我们将 \(u\) 重新定为该子树的根,可以将这个子树分为几个更小的子树,从而可以使两边的和更平均,答案会更大。那么答案应该在不存在这样的子树时取到,即树的重心。
这时我们只需要做一次 01 背包,使用分组背包 + bitset 的手法可以做到 \(O(\dfrac{n \sqrt n}{w})\) 的复杂度,可以通过 \(n \le 10^6\) 的数据范围。
边三连通分量
待补。
[USACO17DEC] Push a Box P
不难想到一个 \(O(n^2m^2)\) 的做法:记录人和箱子的位置进行 bfs 即可。
但是你发现人只有在箱子四周才能够去推动箱子,因此可以将状态简化为:\((x,y,st)\) 表示箱子在 \((x,y)\),人在其上/下/左/右是否可达。
推箱子是简单的,但是我们还有一个操作:人走到箱子的一个方向。此时能进行这种操作要求人能从当前位置不经过箱子走到换向的位置,由于这两个位置必定可以通过箱子连通,因此该条件等价于这两个点点双连通。因此求出所有点,判断这两条边是否在同一点双即可。
时间复杂度 \(O(nm)\)。
[APIO2018] 铁人两项
先考虑一种平凡的情况:若 \(s,c,f\) 在同一点双中则一定合法。证明考虑建立网络流模型:源点 \(S\) 连向 \(s,f\),汇点连向 \(c\),那么我们即证限制所有边、点流量均为 \(1\) 的情况下,最大流为 \(2\),即最小割大于 \(1\)。由于边双连通星,无论我们割掉任意一条边或一个点,总能找到一条其他的路径代替,因此最小割为 \(2\)。
那么我们考虑缩点。缩点后的路径问题使用圆方树刻画,固定 \(s,f\) 后圆方树路径上所有点双内的点均能作为 \(c\)。于是将方点点权设为点双大小,圆点点权设为 \(-1\),答案即所有圆点的路径权值和,可以在 \(O(n)\) 内计算。
时间复杂度 \(O(n+m)\)。
「SWTR-8」地地铁铁
这个限制直接做你发现非常不好处理,于是考虑正难则反,即统计点对 \((x,y)\) 满足所有 \(x,y\) 之间的路径均要么都是 \(0\) 要么都是 \(1\) 的点对个数。具体地,可以分为以下三种讨论:
-
\(x,y\) 之间的路径全部为全 \(0\) 路径;
-
\(x,y\) 之间的路径全部为全 \(1\) 路径;
-
\(x,y\) 之间的路径既有全 \(0\) 路径又有全 \(1\) 路径。
第一、二种情况是对称的,我们一起考虑。
首先,图上简单路径问题考虑点双刻画。对于同一点双内的 \(x,y\),由于对于任意其点双内的点 \(z\),均有路径 \(x \to z \to y\),因此对边同理:将边 \((u,v)\) 拆成 \((u,w),(w,v)\) 不影响双连通性,故对任意边 \((u,v)\) 均有路径 \(x \to u \to v \to y\)。因此,对于一个点双,若其内所有边的边权均为 \(0\),则该点双内所有点对均合法;否则不合法。
现在考虑点双之间的点。考虑两点之间经过的所有点双,根据上述结论,均需要满足其内边权均为 \(0\)。具体来说,假设需要统计全 \(w\) 路径的点对个数,则我们删除不满足点双内的边边权全为 \(w\) 的点双内的所有边,此时的 \(\sum \dfrac{sz(sz-1)}{2}\) 就是这部分的答案。
现在考虑第三种情况。
可以发现,这种情况只会在同一个点双内部出现。否则假设点 \((x,y)\) 之间经过了割点 \(z\),那么存在一条 \(x \to z \to y\) 的全 \(0\) 路径,且存在一条 \(x \to z \to y\) 的全 \(1\) 路径。此时我们只需要交换两条路径 \(z \to y\) 的部分可以构造出两条 \(0,1\) 均存在的路径,不合法。
此时手玩一下你会发现这个限制特别严,一个点双内部只会有至多一个。事实上该结论成立,考虑证明。
假设合法点对为 \(x,y\),记 \(S\) 为全 \(0\) 路径上的边集,\(T\) 为全 \(1\) 路径上的点集。我们应当有 \(S \cap T = \{x,y\}\),否则找一个 \(x,y\) 以外的 \(z \in S \cap T\) 可以仿照上面的部分构造出不合法的路径。同理可知,若存在 \(u \in S,v \in T\) 使得 \(u,v\) 间存在连边,则必定有 \(u,v\) 其中一个为 \(x,y\)。
但是我们有对于点双内的点 \(z\),总有路径 \(x \to z \to y\),因此有 \(z \in S \cup T\)。故 \(S \cup T\) 即为整个边双。那么我们很容易得出,若点双内有且仅有两个同时有 \(0,1\) 边相连的点,则这两个点满足条件。
总时间复杂度为 \(O(n+m)\)。
[ICPC 2020 Shanghai R] Traveling Merchant
待补。
[AGC071C] Orientable as Desired
待补。

浙公网安备 33010602011771号