2025.5.29 图连通性问题选讲
5.29 图连通性问题选讲
[QOJ 10272] Majority Graph
神奇题目
我们肯定不希望连所有的边,而希望通过连 \(O(n)\) 左右的边,完全刻画连通性。
考虑哪些边是毫无必要的。
设当前连的区间 \([l,r]\) 众数为 \(x\),那么有三种区间:
- \(a_l=a_r=x\)
- \(a_l=x,a_r\neq x\) 或 \(a_l\neq x,a_r=x\)
- \(a_l,a_r\neq x\)
注意到第三种区间是完全没用的,因为若 \([l,r]\) 的众数为 \(x\),去掉两边不等于 \(x\) 的数众数一定还是 \(x\),所以 \((l,r)\) 会通过前两种边联通。
经典的,令 \(=x\) 的数为 \(+1\), \(\neq x\) 的为 \(-1\),求前缀和画折线。
1. \(a_l=a_r=x\)
要求 \(s_{l-1}<s_r\) 也就是 \(s_l\le s_r\)。显然我们只需要连 \(s_l=s_r\) 和 \(s_l+1=s_r\) 就可以,且都只用连极小区间,开桶维护即可。
2. \(a_l=x,a_r\neq x\)
要求 \(s_{l-1}<s_r\),形如谷底向一段下坡连边。注意到谷底和峰顶一定联通,那么只需要在下坡连形如 \((i,i+1)\) 的边即可,可以差分维护区间连边。
显然只需找下坡左边的 \(\min s_l\)。
\(a_l\neq x,a_r=x\) 同理。
把每种 \(x\) 拎出来单独做就可以做到线性。
写了 1h 把自己写晕了,于是找了一份 std 学习/kk
学到了一种简单的计算 \(s\) 的方法 s[j]=(j+1<<1)-pos[j];
[Luogu 12445] 数好图
计数题。
首先考虑 \(k=n\) 即所有点都在 \(1\to n\) 的路径上。注意到只需保证除 \(1\) 之外所有点入度 \(>0\),除 \(n\) 之外所有点出度 \(>0\) 即可。
两个条件不好,容斥掉一个。\(f1(i,j)\) 表示后 \(i\) 个点,钦定 \(j\) 个点入度为 \(0\) 的方案数,要求 \(j<i\) 即第 \(i\) 个点只能在转移时被钦定是否有入度(其实就是为了让第一个点没有限制)。
容易通过 \(f1\) 容斥得出 \(g(i)\) 表示 \(i\) 个点都在 \(1\to i\) 的路径上的方案数。
接下来考虑插入其他点并保证新的点不在 \(1\to n\) 的路径上。
图中的点可以分为三类:
- \(1\to i,i\to n\)
- \(1\to i,i\not\to n\)
- \(1\not\to i\)
- 1 类点可以和编号比它小的 3 类点连边。
- 2 类点可以和编号比它小的 1 2 3 类点连边,且必须至少和一个 1 或 2 类点连边。
- 3 类点可以和编号比它小的 3 类点连边。
注意到,3 类点可以向任意编号比它大的点连边,贡献可以单独计算。
这样就只剩下形如 \(1\to 2\) 和 \(2\to 2\) 的连边,\(f2(i,j)\) 表示当前有 \(i\) 个 1 类点,\(j\) 个 2 类点的方案数。初始 \(f(1,0)=1\),转移时每个 2 类点可以和前面的所有点连边。统计答案时要限定最后一个点是 1 类点。
最后把三部分贡献乘起来就好啦。
[CF1062F] Upgrading Cities
先求拓扑序,这样 \(x\) 前面的点不可能被 \(x\) 到达, \(x\) 后面的点不可能到达 \(x\),这是好的。
考虑 \(x\) 前面的点都能到达 \(x\) 的充要条件,把 \(x\) 之前的拓扑图拿出来,所有点都能到 \(x\) 等价于除 \(x\) 之外所有点出度都 \(>0\),这样我们总是能从一个点出发,在拓扑序上不断往后走,最终走到 \(x\)。
考虑只有 \(1\) 个点不能到 \(x\),那么这个点出度 \(=0\),且它的所有入点出度 \(>1\)(否则删掉这个点后会有新的出度 \(=0\) 的点)。
上面两个条件都是容易在从左往右加边时维护的。
\(x\) 能到达后面的点,在反图上等价于这些点都能到 \(x\),所以在反图上再做一遍即可。
[Luogu 9829] Traveling Merchant
注意到我们必须走出形如一个 \(6\) 的路径,其中环的两个接口颜色相同。
考虑枚举这条同色边 \((x,y)\),判断能否走出这条路径。
注意到这等价于判断 \(1\) 能否不经过环上点地走到 \(x,y\) 之一。
找“不经过某些点”的路径想到点双,因为点双内两点至少有 2 条点不相交路径。
若 \(x,y\) 在同一个点双内,\(1\) 先走到割点,割点走到 \(x\to y\) 的某条路径上,沿着这条路径到 \(y\),再沿着另一条路径到 \(x\) 即可。
建出圆方树,考虑 \(x,y\) 不在同一个点双内的情况。
注意到,如果 \(x,y\) 的 \(lca\) 距离 \(x,y\) 比较远,那么 \(lca\) 必然被经过多次(如果是方点的话,路径上的圆点必然经过多次)。
只有 \(y\) 是 \(x\) 的祖先或者 \(y\) 的父亲方点是 \(x\) 的祖先时,才能走出不重复经过点的路径。
建圆方树判一下子树即可。
[AGC071C] Orientable as Desired
自然的,考虑代入一些 \(x_i\) 的值排除掉一些情况。
代 \(x_i=0\),非二分图必定无法满足。
接下来只考虑二分图的情况。
最简单的二分图是树,发现树可以满足任意 \(x\)。从上到下钦定边的方向,每个点最多有一条边被钦定过,剩下的边可以任意选,显然能够满足要求。
接下来考虑基环树,显然环必然是偶环,发现只要环上每个点都挂了树,就可以满足要求。只需让环上的相邻边反向即可。
考虑赋值 \(x=(k,0,0,0,\dots)\),以 \(1\) 为割点分开的每个连通块都是二分图,那么定向方式就只有两种,即可以选择让内部的所有边指向 \(1\) 或相反。
这样的话,假设每个连通块和 \(1\) 的连边分别有 \(a_1,a_2,\dots\) 条,能凑出 \([0,\sum a_i]\) 的充要条件是 \(a_i\le s_{i-1}+1\),证明平凡。
注意到会和 \(1\) 连边的连通块就是儿子的点双,也可以证明推广到所有点都满足就是原题无解的充要条件。
[CF475E] Strongly Connected City 2
一个边双显然可以定向成强连通图,具体的,找出一棵 dfs 树,树边全部向下,非树边全部向上。
考虑边双缩点后的树,最大化边双间的贡献。
感受上,对于根的若干子树,选接近一半的子树内向,另一半外向,贡献是很大的。
如何证明?本质是 \(x\to y\) 的路径上,最多有两个颜色段。
考虑存在形如 \(x\to a\Leftarrow b \to y\) 的路径,希望证明反向 \(x\to a\) 或 \(b\to y\) 后,答案不降。
记 \(a\) 的内向子树大小为 \(C\),外向为 \(A\),\(b\) 的内向子树为 \(B\),外向为 \(D\)。
反向 \(x\to a\),答案的变化量为 \(X(C-A+B)\);反向 \(b\to y\),答案的变化量为 \(Y(D-B+A)\)。
当 \(A>B\) 时,反转 \(b\to y\);否则反转 \(x\to a\),显然答案严格不降。证毕。
枚举每个点是根,背包能凑出的大小,加上子树内的贡献即可做到 \(O(n^2)\)(背包复杂度均摊 \(\sum deg\))。
还可以证明,我们一定选择带权重心为根,这样可以做到 \(O(n\log n)\) 或者 \(O(\frac{n\sqrt n}{\omega})\)。
[CF1338E] JYPnation
之前做过相同条件的竞赛图的题目,不过两个题需要的性质不完全相同。在这个题中,我们关注整个图的结构,而不太关注导出子图。
注意到有环则必有三元环,于是图的结构形如有向链 \(\to\) 强连通分量。有向链部分的贡献容易计算,可以删去。
(这部分和那道题的“删 0 度点”异曲同工)。
下面只考虑强连通分量的情况。
Lemma 1 :\(dis(u,v)<4\)。
若 \(dis(u,v)=4\),则可以画出导出子图:

(Social_Zhao 老师的图太好了)
注意到标黄的 \(4\) 个点就是一个不合法子图。
于是 \(dis(u,v)\le 3\)。
\(dis(u,v)=1\) 的就是边数,只需要在 \(dis(u,v)=2\) 和 \(dis(u,v)=3\) 中选一个算就好了。
显然 \(dis(u,v)=2\) 更简单,要求 \(v\to u\) 且存在 \(u\to a,a\to v\)(这就是个三元环啊qeq)。
Lemma 2:若 \(u\to b,a\to b\),则必有 \(b\to v\)。
也就是说,我们只需要找 \(u\) 的出边里拓扑序最大的那个,判断它是不是指向 \(v\) 就好了。
找的方法就是 \(u\to v\) 代表 \(rk_v>rk_u\),扫一遍 \(u\) 的出边就行了。
于是我们就水灵灵的做完了。

浙公网安备 33010602011771号