2023.01.07 图论&2023.01.08 网络流 学习笔记
讲课人:杨宁远。
这讲大概比较简单?
网络流的复杂度就不分析了吧……
图论
1.AT_agc056_c [AGC056C] 01 Balanced
把 \(0\) 看成 \(-1\),把 \(1\) 看成 \(1\),对字符串做一遍前缀和得到 \(sum\) 数组。那么限制就是 \(sum_{r_i}=sum_{l_i-1}\) 且 \(|sum_{i}-sum_{i-1}|\le1\),于是可以差分约束建图跑最短路,这样每个 \(sum_i\) 都有若干限制表示 \(sum_i\) 不能超过多少,跑出来的最短距离就表示 \(sum_i\) 在满足所有限制的情况下能取到的最大值,原字符串的字典序也自然最大,最后只要每位翻转一下就可使字典序最小。同时因为 \(0\) 的边连的是两个奇偶性相同的点,\(1\) 的边连的是相邻两个点(奇偶不同),一开始 \(sum_0=0\),所以 \(sum_i\) 的奇偶性与 \(i\) 的奇偶性相同,不会有 \(sum_i=sum_{i-1}\) 的情况。可以 01 bfs 代替最短路求解。
时间复杂度 \(O(n+m)\),空间复杂度 \(O(n+m)\)。
2.P2024 [NOI2001] 食物链
种类并查集可以直接做,但是要开 \(3n\) 的空间,如果是 \(k\) 类就要 \(kn\) 的空间。一个更好的方法是带权并查集,给 \(A,B,C\) 依次标号为 \(0,1,2\),于是 \(x\) 吃 \(y\) 当且仅当 \(x+1\equiv y\pmod 3\),用带权并查集维护如果根是 \(0\) 那么该点的标号是多少,这样无论 \(k\) 多大都只用 \(n\) 的空间了。
时间复杂度 \(O(n\alpha(n))\),空间复杂度 \(O(n)\)。
3.CF118E Bertown roads
先任意跑一棵 DFS 树出来,这样只有树边和返祖边。设一条返祖边 \((x,y)\) 覆盖了 \(x\) 到 \(y\) 路径上的所有树边,如果一条树边没有被非树边覆盖过,它就是割边,此时肯定无解。否则每条树边从近根位置指向远根位置,每条非树边从远根位置指向近根位置,这样对于每个点,该点到其父亲的边都被子树内某个点指出的返祖边覆盖,于是可以走到子树内的那个点然后跳一次返祖边到深度更小的点,从而可以到达根。
时间复杂度 \(O(n+m)\),空间复杂度 \(O(n+m)\)。
4.P4151 [WC2011]最大XOR和路径
DFS 树+线性基板子题,略。
5.CF160D Edges in MST
先任意跑一棵 DFS 树出来,对于一条非树边如果比树上对应路径的树边的最大值大那就是「不可能」,如果相等那就是「可能」并且树上对应路径的树边都是「可能」,枚举完每条非树边后剩下的树边都是「一定」。具体可以用倍增和差分做。
时间复杂度 \(O(n\log n+m)\),空间复杂度 \(O(n+m)\)。
6.P4630 [APIO2018] 铁人两项
圆方树板子题,略。怎么讲题人这么爱讲板子题。
7.CF487E Tourists
还是圆方树板子题,略。怎么讲题人这么爱讲板子题!
8.CF1697F Too Many Constraints
我一开始是这么想的:由于 \(k\) 很小,对每个数 \(a_i\) 拆成 \(a_i=x\) 和 \(a_i\ne x\) 共 \(2k\) 个点,其中 \(x\in[1,k]\),然后就常规建图,没有意识到哪里不对劲。然而题解一句话就点醒了还在做梦的我:取值型问题一般状态设计是变量 \(x\ge k\)。形如 \(x=k\) 的状态设计不好做,因为默认了 \(x\) 的若干个状态中必须有且只有一个为 \(\text{True}\),然而实际建图中无法建出这样的限制条件。所以说对每个数 \(a_i\) 拆成 \(a_i\le x\) 和 \(a_i\gt x\) 共 \(2(k+1)\) 个点,其中 \(x\in[0,k]\),这样每个条件都可以只建 \(O(k)\) 条边就好了。
时间复杂度 \(O(k(n+m))\),空间复杂度 \(O(k(n+m))\)。
9.LOJ#3629. 「2021 集训队互测」序列
首先每条信息就是说 \(a_i,a_j,a_k\) 的中位数为 \(x\)。显然有 \(a_i<x\Rightarrow a_j\ge x,a_k\ge x\)(同理还有两条),\(a_i>x\Rightarrow a_j\le x,a_k\le x\)(同理还有两条)。神奇的是有这 \(6\) 个条件就足以推出 \(a_i,a_j,a_k\) 的中位数为 \(x\),证明考虑 \(a_i,a_j,a_k\) 中有无 \(<x\) 的数,有无 \(>x\) 的数共 \(4\) 种情况即可。那么就可以像上一题一样把每个点拆成若干对点形如 \(a_i<x\) 和 \(a_i\ge x\),同时有用的点数是 \(O(m)\) 的,边数也是 \(O(m)\) 的。
时间复杂度 \(O(n+m)\),空间复杂度 \(O(n+m)\)。
10.CF1458D Flip and Reverse
假设一开始在 \(0\),按顺序遍历字符串,假设走到了 \(x\),如果该位是 \(0\) 则向左走一位到 \(x-1\),如果该位是 \(1\) 则向右走一位到 \(x+1\),最终会走到某个点 \(t\)。也就是说,如果把 \(0\) 看成 \(-1\),把 \(1\) 看成 \(1\),对字符串做一遍前缀和得到 \(sum\) 数组,并对任意 \(i\in[1,n]\) 从 \(sum_{i-1}\) 向 \(sum_{i}\) 连一条有向边,那么会得到一张有向图,一条从 \(0\) 到 \(t\) 的欧拉路径即往左走一次往答案串末尾添一个 \(0\),往右走一次往答案串末尾添一个 \(1\)。注意到如果某一个子串的 \(0,1\) 个数相等,那么在图上体现出来的一定是从某个点出发,每次向左或向右,最终走回出发点。那么把这个子串翻转再反转就相当于把从某个点出发走回到这个点的路径反转了一下。现在图上任意一个环都可以被反转,所以就可以当无向图来做了。我们最终要找一条从 \(0\) 到 \(t\) 的欧拉路径,使得得到的答案串字典序最小。这可以贪心地求,能往左就往左,否则往右。
时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。
11.CF1266H Red-Blue Graph
设 \(x_i\) 表示经过 \(i\) 指出的红边的次数,\(y_i\) 表示经过 \(i\) 指出的蓝边的次数,那么 \(x_i=y_i+[s_i=R]\)。假设所在点为 \(v\),那么除了 \(1\) 和 \(v\) 外的点进去和出来的次数都相等,\(1\) 多出来一次,\(v\) 多进去一次,设 \(R_i\) 表示有红边指向 \(i\) 的点的集合,\(B_i\) 表示有蓝边指向 \(i\) 的点的集合,即 \(\sum_{r\in R_i}x_r+\sum_{b\in B_i}y_b=x_i+y_i-[i=1]+[i=v]\),代入 \(x_i=y_i+[s_i=R]\) 并化简得:\(2x_i-\sum_{r\in R_i}x_r-\sum_{b\in B_i}x_b=[s_i=R]-\sum_{b\in B_i}[s_b=R]+[i=1]-[i=v]\)。
可以发现等式左边是由图的结构决定的,不会因询问发生变化,用矩阵 \(A\) 表示系数,\(x\) 表示未知数组成的向量,\(z\) 表示等式右侧的值组成的向量,即 \(Ax=z\)。注意到由矩阵树定理 \(A\) 的行列式即以 \(n\) 为根的根向树个数,而 \(n\) 从任意一个点出发都可达,所以 \(A\) 的行列式大于 \(0\),即 \(A\) 满秩,所以 \(A\) 存在逆矩阵。求出 \(A\) 的逆矩阵 \(A^{-1}\),每次查询时由 \(x=A^{-1}z\) 可以 \(O(n^2)\) 解得 \(x\)。知道 \(x\) 后答案即为 \(\sum_{i=1}^{n-1}(2x_i-[s_i=R])\)。
但是满足上述方程只是状态可达的必要条件,而这并不充分。其充要条件为:1. 由上述方程解得的 \(x\) 都为非负整数,特别地,\(s_i=R\) 时 \(x_i\) 不能为 \(0\)。2. 只考虑每个点的活跃边的导出子图,每个被经过至少一次的点都可以只通过活跃边(有向的)到达 \(v\)。
先考虑必要性。第一个条件比较显然,第二个条件考虑对 \(\sum_{i=1}^{n-1}(2x_i-[s_i=R])\) 进行归纳证明:\(\sum_{i=1}^{n-1}(2x_i-[s_i=R])=0\) 时显然;设 \(\sum_{i=1}^{n-1}(2x_i-[s_i=R])=k-1\) 时在点 \(u\),则 \(k-1\rightarrow k\) 时 \(u\) 交换其指出的两条边的活跃性,并沿着新的活跃边走到了 \(v\),由于 \(k-1\) 时所有被经过至少一次的点都可以只通过活跃边到达 \(u\),且它们能否到达 \(u\) 与 \(u\) 连出的活跃边指向哪并没有关系,所以 \(k\) 时所有被经过至少一次的点(除去 \(v\))仍都能到达 \(u\),再通过 \(u\) 的活跃边便都能到达 \(v\)。
再考虑充分性。首先 \(\sum_{i=1}^{n-1}(2x_i-[s_i=R])=0\) 时所有满足上述条件的 \((s,v)\) 一定合法,且恰有一组 \((s,v)\) 满足条件。设 \(\sum_{i=1}^{n-1}(2x_i-[s_i=R])=k-1\) 时所有满足上述条件的 \((s,v)\) 都合法,且恰有一组 \((s,v)\) 满足条件,\(k\) 时 \((s',v')\) 满足上述所有条件。考虑在原图的活跃边的导出子图中,所有被经过至少一次的点与它们能否到达 \(v'\) 与 \(v'\) 连出的活跃边指向哪并没有关系,可知若在导出子图中 \(v'\) 的活跃边指向的点未被访问过,则所有被经过至少一次的点形成了一棵以 \(v'\) 为根的根向树,同时可知 \(v'\) 是第一次被到达,且在导出子图中指向 \(v'\) 的活跃边有且仅有一条,因此可以唯一确定 \(k-1\) 时的满足条件的状态;否则,\(v'\) 的活跃边指向其子树内一点 \(w\),\(w\) 的祖先中活跃边指向 \(v'\) 的点是 \(u\),那么 \(v'\) 只有是从 \(u\) 来的才能使 \(k-1\) 时的状态满足条件(否则不满足条件 \(2\))。所以已知 \(k\) 时满足条件的 \((s',v')\) 可以恰好确定一组 \(k-1\) 时满足条件的 \((s,v)\),而如果 \(k-1\) 时有至少两组不同的 \((s',v')\) 满足条件,那么可以确定至少两组 \(k-1\) 时满足条件的 \((s,v)\),且 \((s,v)\) 互不相同,这与归纳假设矛盾。所以 \(k\) 时恰有一组 \((s',v')\) 满足上述条件,自然也就合法了。
因此,只需判下是否有解,再用上述方法求解即可。根据上述分析,给定 \(s\) 和 \(v\) 后可以唯一确定 \(x\),所以答案在 \([0,(n-1)2^{n-1}]\) 之间,那么可以用两个大于 \((n-1)2^{n-1}\) 的质数作为模数求出模意义下的结果,根据在不同模数下结果是否相等可以判断出 \(x\) 是否是非负整数。时间复杂度 \(O(n^3+qn^2)\),空间复杂度 \(O(n^2)\)。
网络流
12.P3254 圆桌问题
源点向第 \(i\) 个单位连 \(r_i\) 的边,第 \(i\) 个餐桌向汇点连 \(c_i\) 的边,每个单位向每个餐桌连 \(1\) 的边,跑最大流即可。
13.P2472 [SCOI2007] 蜥蜴
条件就相当于第 \(i\) 行 \(j\) 列的石柱最多只能被经过 \(h_{i,j}\) 次,那么把石柱拆入点和出点,入点向出点连 \(h_{i,j}\) 的边,每个不能跳出界外的石柱的出点向可到达的石柱连 \(\inf\) 的边,每个不能跳出界外的石柱的出点向汇点连 \(\inf\) 的边,源点向每个有蜥蜴的石柱的入点连 \(1\) 的边,跑最大流即可。
14.P2765 魔术球问题
如果 \(x<y\),\(x+y\) 是完全平方数,那就从 \(x\) 向 \(y\) 连一条有向边。\(m\) 个球至少要多少根柱子才够放?这等价于连出的新图上最少用几条不相交的路径才能覆盖所有点。而 DAG 最小路径覆盖的做法是:把每个点拆成入点和出点,源点向入点连 \(1\) 的边,出点向汇点连 \(1\) 的边。如果在原图中有一条 \(x\rightarrow y\) 的边,那在新图上从 \(x\) 的入点向 \(y\) 的出点连一条 \(1\) 的边,表示原来可以看成 \(n\) 个点每个点自成一条路径,如果有 \(x\rightarrow y\) 的边且 \(x\) 是所在路径的最后一个点,\(y\) 是所在路径的第一个点,则可以合并 \(x,y\) 所在路径。求出的最大流就是最多可以合并的次数,所以答案就是总点数减去最大流。
回到原问题,从小到大枚举答案 \(m\),\(m\) 时的网络相比 \(m-1\) 时的网络只多了 \(m\) 的入点出点以及与其相关的边,那么把点和边都加上去在残量网络上再增广更新最大流。只要找到最大的 \(m\) 使得 \(m\) 减去最大流不超过 \(n\),那么 \(m\) 就是答案。
15.P3163 [CQOI2014]危桥
首先 \(a_1\) 和 \(a_2\) 之间来回 \(a_n\) 次可以看作 \(a_1\) 向 \(a_2\) 走 \(2a_n\) 次,\(b\) 同理。考虑每条桥 \((x,y)\) 在 \(x,y\) 间连 \(\inf\) 的双向边,每条危桥 \((x,y)\) 在 \(x,y\) 间连 \(2\) 的双向边。在此基础上源点向 \(a_1\) 连 \(2a_n\) 的边,向 \(b_1\) 连 \(2b_n\) 的边,\(a_2\) 向汇点连 \(2a_n\) 的边,\(b_2\) 向汇点连 \(2b_n\) 的边,跑最大流看是否满流。但是问题是 \(a_2\) 的流量不一定来源于 \(a_1\) 而可能来源于 \(b_1\)。那么我们把源点向 \(a_1\) 连 \(2a_n\) 的边,向 \(b_2\) 连 \(2b_n\) 的边,\(a_2\) 向汇点连 \(2a_n\) 的边,\(b_1\) 向汇点连 \(2b_n\) 的边,再跑一次最大流看是否满流。如果两次都满流那答案就是 Yes
,否则答案就是 No
。下面我们来证明一下。
首先如果存在方案那么两次都是满流比较显然。下证如果两次都是满流那就一定存在方案。
这是上述两种图中最终流量结果,表示几种本质不同的流量路径,由于每条边的流量要么是 \(2\) 要么是 \(\inf\),所以我们可以通过给每条路径的流量 \(+d\) 或 \(-d\)(\(d=0\) 或 \(1\))使得每条路径的流量都是偶数,即 \(x,y\) 都是偶数,如下图:
不妨设 \(x\ge y\),把两种图的流量相加除以二得:
此时 \(a_1,a_2\) 的入流出流都满足条件,\(b_1,b_2\) 的入流出流都平衡,所以考虑把 \(b_1\) 到 \(b_2\) 路径上的流量加上 \(2b_n\) 使得\(b_1,b_2\) 的入流出流满足条件:
而上图等价于:
此时已经满足 \(a_1\) 向 \(a_2\) 流了 \(2a_n\) 的流量,\(b_1\) 向 \(b_2\) 流了 \(2b_n\) 的流量了,但是每条红色和蓝色的边的流量还可能是小数(化成最简分数后分母可能是 \(1\) 或 \(2\)),那么再给它们 \(+d\) 或 \(-d\)(\(d=0\) 或 \(\frac{1}{2}\))就可以使每条边都是整数了,即构造出了合法的方案。
16.CF1404E Bricks
假设一开始每个黑格都用一个矩形覆盖,现在我们要选出尽量多的边界,每次合并边界两边的黑格子,表示把原来覆盖它们的两个矩形合并成一个。那么把两边均是黑格的边界看成点,对于一个方格的左右边界和上下边界不能同时选,即一个方格的左、右边界分别和上、下边界各连一条边,答案就是这张图的最大独立集。根据二分图最大独立集等于总点数减最大匹配可求出答案。
17.P4313 文理分科
首先源点向每位同学连 \(art_{i,j}\) 的边,每位同学向汇点连 \(science_{i,j}\) 的边,两边不能同时选,我们要使选出来的价值和最大,也就是要让删掉的价值和最小,即要求最小割。那么 \(same\_art_{i,j}\) 其实就是 \((i,j)\) 这位同学和他旁边的同学都选文科才有的收益,也就是说如果 \((i,j)\) 这位同学和他旁边的同学有人选理科了那 \(same\_art_{i,j}\) 就不会贡献到答案里,即要被割掉。于是对每个 \((i,j)\) 建一个虚点,源点向虚点连 \(same\_art_{i,j}\) 的边,虚点向 \((i,j)\) 这位同学和他旁边的同学都连 \(\inf\) 的边。\(same\_science_{i,j}\) 同理。
18.P3227 [HNOI2013]切糕
对每个 \((x,y)\) 建 \(R+1\) 个点 \(p(x,y,0)\sim p(x,y,R)\),源点向 \(p(x,y,0)\) 连 \(\inf\) 的边,\(p(x,y,R)\) 向汇点连 \(\inf\) 的边,相邻两个点间连边连出 \(R\) 条边,割掉第 \(z\) 条边表示在 \((x,y)\) 处选了 \((x,y,z)\) 这个点,所以第 \(z\) 条边流量为 \(v(x,y,z)\)。考虑相邻两个位置 \((x,y)\) 和 \((x',y')\) 间的限制 \(∣f(x,y)−f(x',y')∣\le D\),绝对值拆开后是 \(f(x,y)−f(x',y')\le D\) 且 \(f(x',y')-f(x,y)\le D\),对于前者 \(f(x,y)\le f(x',y')+D\),如果知道 \(f(x',y')=z'\),那么 \(f(x,y)\le z'+D\),也就是 \((x,y)\) 的第 \(1\sim z'+D\) 条边中必须割一条,所以由 \(p(x,y,z'+D)\) 向 \(p(x',y',z')\) 连一条费用为 \(\inf\) 的边,其他边同理。注意由于 \(p(x,y,0)\sim p(x,y,R)\) 之间的 \(R\) 条边只能割恰好一条,已经保证了至少割一条,还需保证不会割超过一条,所以给这些边的流量都加上一个和 \(\inf\) 相比足够小但和其它边的边权和相比又足够大的值即可。
19.P4001 [ICPC-Beijing 2006] 狼抓兔子
经典平面图网络流转对偶图跑最短路题,略。
20.CF1517G Starry Night Camping
对所有点进行染色,对两维坐标都和 \((1,0)\) 同奇偶的点染 \(1\),都和 \((0,0)\) 同奇偶的点染 \(1\),都和 \((0,1)\) 同奇偶的点染 \(1\),都和 \((1,1)\) 同奇偶的点染 \(4\),那么每个不合法的图案恰和一条 \(1\rightarrow2\rightarrow3\rightarrow4\) 的路径一一对应,把每个有帐篷的点拆成入点和出点,入点向出点连 \(w_i\) 的边,染 \(1,2,3\) 的出点分别向染 \(2,3,4\) 的入点连 \(\inf\) 的边,源点向染 \(1\) 的入点连 \(\inf\) 的边,染 \(4\) 的出点向汇点连 \(\inf\) 的边,跑最小割即可。
21.P2762 太空飞行计划问题
一开始把所有实验的收益加入答案,那么最终答案要减去没选的实验的收益和选的仪器的费用的总和。源点向每个实验连流量为实验收益的边,每个实验向其需要的仪器连 \(\inf\) 的边,每个仪器向汇点连仪器费用的边,一条源点向实验连的边是否被割掉表示该实验是否不选,一条仪器向汇点连的边是否被割掉表示该仪器是否选。跑最小割即可。
22.P4177 [CEOI2008] order
首先这题的工作等价于上题的实验,这题的机器等价于上题的仪器,如果这题不能租那么建图就和上题一模一样了。但是可以租,我们把上题「每个实验向其需要的仪器连 \(\inf\) 的边」改成「每个工作向其需要的机器连流量为该机器租用代价的边」,那么工作向机器连的边是否被割掉表示是否租用该机器。跑最小割即可。