2022-7-2 网络流听课笔记
CF925F
题目叙述
一个上下界网络流问题,每条边的流量在 \([at+b,ct+d]\) 内。t 在 \([0,1]\) 内随机,求这张图有多少概率有解。
题解
如果 \(t\) 不形成一个区间,那这个题就太难了。所以猜测 \(t\) 形成一个区间。
其次,这个东西如果是单调的,那就太简单了。所以我们猜他是凸的,需要三分这个区间。
先温习一下怎么求上下界网络流的可行解。先保证每条边都至少有下界那么多,然后再满足流量平衡。具体地,如果在每条边流满下界时,流出比流入多,那么就从 \(s\) 向这个点连接多流出的那些流量,否则就从他向终点链接。有解当且仅当所有 \(s\) 流出的边都流满了。
考虑证明一下上面猜测的结论。
引理:\(\lambda maxflow(t_1)+(1-\lambda) maxflow(t_2)\le maxflow(\lambda t_1+(1-\lambda)t_2)\)
这一点的证明基于如下事实:跑最大流的图每条边的流量是一个关于 \(t\) 的固定的一次函数。因此对于 \(t_1\) 和 \(t_2\) 构成最大流的那组解,在每条边的流变为 \(\lambda f(t_1)+(1-\lambda)f(t_2)\) 之后就是一组流。因此最大流不小于这个值。所以 \(maxflow(t)\) 就是一个上凸函数。
那么只要找到 \(sum(t)-maxflow(t)\) 的零点即可。其中 \(sum(t)\) 理解为所有连向 \(s\) 的边的边权和。
而这个东西实际上是一个下凸函数,因为其实它的形式是 \(\sum_{} \max(a_ix+b_i,0)\) ,其中 \(i\) 代表一条从源点连向一个点的边。这是因为 \(\max(ax+b,0)\) 是一个下凸函数,所以一大堆函数相加也是一个下凸函数。
所以 \(gap(t)=sum(t)-maxflow(t)\) 是一个下凸函数减去上凸函数,因此还是一个上凸函数。那么直接三分即可。
总结
- 题目不会太难,所以要猜一些简单的结论。
- 证明不会太难,所以可以考虑使用这样一个显然的不等式:\(\forall T\subseteq S,\max(T)\le \max(S)\) 。
P3263 危桥
题目叙述
给定无向图,两个人分别从 \(a_1\) 走到 \(a_2\) 和 \(b_1\) 走到 \(b_2\) ,分别要走 \(2a_n\) 和 \(2b_n\) 次。每条边有一个经过次数上限,上限制可能是无限也可能是 2 。判断是否有解。原题是要往返 \(a_n\) 和 \(b_n\) 次,现在改成单向经过所以要乘二。
题解
设 \(f_A(u,v)\) 表示 \(A\) 正向通过边 \((u,v)\) 了多少次。
那么需要保证的就是 \(|f_A(u,v)|+|f_B(u,v)|\le 2\) 。因为明显可以保证一个人不会正着经过一条边再反过来经过这条边(如果这样,明显可以类似LGV引理那样交换路径)。
这个限制等价于 \(f_A(u,v)+f_B(u,v)\le 2\) 并且 \(f_A(u,v)-f_B(u,v)\le 2\) 。这是因为 \((u,v)\) 和 \((v,u)\) 有类似的不等式。
这件事情直接通过网络流刻画即可。A 的起点和 B 的起点作为源点向 A 的终点和 B 的终点跑最大流,再把 A 的起点和 B 的终点向 A 的终点和 B 的起点跑最大流。如果都能够流到 \(2n\) 次,那就意味着优解。
至于构造呢,因为每条边的流量都是偶数,所以可以考虑先都 \(\div 2\) ,跑完两次的流量相加为 A 用到的边,相减为 B 用到的边。
总结
- 逐渐意识到,网络流题很需要代数化的形式。
CF1666K Kingdom Partition
题目叙述
将一个图的点分为三个部分ABC,如果一条权值为 \(l\) 边的两个端点都属于A或者都属于B,那么代价为 \(2l\) ,如果一个属于 \(A/B\) 另一个属于 \(C\) ,代价为 \(l\) 。最小化代价。有两个点其中一个钦定属于A,另一个钦定属于B。
题解
一个点一共有三种状态,但是一个变量一共只有两种取值,刻画不了。考虑一个点用两个变量 \(x,y\) 来刻画。
A 和 B 是对称的两种情况,因此考虑用 \(x=0,y=1\) 和 \(x=1,y=0\) 来刻画。C 用 \(x=0,y=0\) 和 \(x=1,y=1\) 来刻画。这一步多试试应该就能试出来怎么刻画。
最小割可以表现的贡献有两种,一种是 \(x=0,y=1\)有贡献 \(l\), 在 \(x,y\) 之间连接一条边,流量为 \(l\)。另一种是 要么 \(x=0\) ,要么 \(y=1\),在之间连接 \(\inf\) 的边。
不妨设 0 表示和源点连边,1 表示和汇点连边。
采用第一种刻画这件事情。如果设 \(u\) 的第一个变量为 \(u_1\) ,第二个变量为 \(u_2\) 。那么:
- 两边都是 \(A\) 或者都是 \(B\) ,此时相当于是两个 \(01\) 或者两个 \(10\),我们希望 \(u_1\) 和 \(v_2\) 产生一个贡献并且 \(u_2\) 和 \(v_1\) 产生一个贡献。
- 两边一边是 \(A/B\) 一边是 \(C\) ,相当于 \(01\) 和 \(00/11\) 要产生贡献。此时我们只希望产生一个贡献,所以希望 \(u_1\) 和 \(v_2\) 产生贡献。
发现这两种贡献都可以通过 \(u_1\) 和 \(v_2\) 还有 \(u_2\) 和 \(v_1\) 连接双向边来实现。因此就做完了。
总结
最小割和连接源点汇点很有关系。可以想象为 01 ,另外如果能表现的状态数量和题目上需要的状态数量不匹配,可以考虑增加变量。
CF1383F Special Edges
题目叙述
给定 \(n\) 个点 \(m\) 条边的图,有 \(k\) 条特殊边,每次给出特殊边的流量,求最大流。
\(k\le 10\)。
题解
考虑最大流的另一种表现形式是最小割。最小割由于一条边的状态不是流多少,而是割不割,对处理这个问题很有帮助。
考虑 \(\mathcal O(2^k)\) 枚举割不割,然后跑剩下部分的最大流。
问题就是预处理。考虑每次割掉一条边之后怎么求最大流。直接把这条边上的流量退掉即可。
具体来说一遍DFS,DFS到所有经过这条边的流,退流直到这条边上没有流为止。
总结
考虑最大流不要忘记考虑最小割。
CF1519F Chests and Keys
题目叙述
\(n\) 个箱子 \(m\) 把钥匙,A现在给箱子安装锁,每把锁需要特定的钥匙来解决。打开一个箱子需要的把上面的所有锁全部集全。买第 \(i\) 把钥匙需要 \(B_i\) 块钱,第 \(i\) 个箱子中的有 \(A_i\) 块钱。现在 B 要买钥匙解锁。A要使得B不能赚钱,也就是说能解锁箱子里的锁得到的钱不能大于买钥匙花费的钱。在第 \(i\) 个箱子上装第 \(j\) 把锁的代价为 \(c_{i,j}\) ,求最小代价。\(A_i,B_i\le 4,n,m\le 6\)。
题解
考虑对于一个箱子集合 \(S\) 的限制是什么,限制其实是买需要的钥匙的并集花费的钱数 \(\ge\) 箱子里钱的总和。
这玩意很想霍尔定理,等价于这个带有权值的匹配完美匹配。
考虑直接依次添加每个左部点和右部点,设 \(f_{i,j,k,s}\) 表示左边添加到 \(i\) ,右边添加到 \(j\) ,目前左边每条边的流量记录到 \(s\) 这个状态之中,右边前 \(j-1\) 个点的匹配已经分配完了,第 \(j\) 个点还剩下 \(k\) ,达到这个状态的最小花费是多少。每次转移添加一个右部点可以直接枚举 \(i\) 和 \(j\) 之间匹配了多少,顺便把这条边的花费计算到状态之中。
总结
- 对于一个集合对应的一些东西并集权值总和大于等于一些东西的方案,直接霍尔定理。
- 如果动态规划需要枚举子集这样的操作,可以考虑拆分为一个一个添加数。在这里是添加节点,匹配。

浙公网安备 33010602011771号