网络流相关建模习题
网络流相关建模习题
前置。
1. Menger 定理
- 边连通性:
给定无向图 \(G\),包含起点终点 \(s,t\in V\),定义 Edge-CUT 为一个边集,使得删掉这这个集合的边之后 \(s,t\) 不连通。
有 \(\min\) Edge-CUT \(=\max\) Edge-disjoint paths,即最大边不相交路径(证明可以通过最大流最小割定理,在此不作赘述)。
于是只需要找到无向图中的最多的边不相交路径,令正反边流量均为 \(1\),跑最大流即可。
- 点连通性:
给定无向图 \(G\),包含起点终点 \(s,t\in V\),定义 Vextex-CUT 为一个不含 \(s,t\) 的点集,使得删掉这这个集合的点之后 \(s,t\) 不连通。
有 \(\min\) Vextex-CUT \(=\max\) Vextex-disjoint paths,即最大点不相交路径(除了起点和终点)。
拆点,将除了起点和终点的点 \(i\) 拆成左右两个点 \(x_i,y_i\),连接 \(x_i\rightarrow y_i\),容量为 \(1\),若 \(G\) 中存在边 \((u,v)\),则连接 \(y_u\rightarrow x_v\) 与 \(y_v\rightarrow x_u\)。
2. ABC318G
源点 \(s\) 与 \(A,C\) 相连,使汇点 \(t\) 为 \(B\),检查是否存在两条点不相交的路径。
3. 破坏连通性
有向图 \(G=(V,E)\),每条边有 \(cost_e\) 为删除这条边的代价,现删除一些边,使得 \(s\) 不能到 \(t\) 的最小代价。
割的应用,把代价当做容量。
4. 缩短工期问题
用有向无环图 \(G\) 表示若干任务的先后关系,每条边有权值 \(T_e\) 和 \(cost_e\),分别表示完成这个任务的时间和缩短该任务一天所用的代价,满足以点 \(x\) 为终点的边(任务)结束后,以 \(x\) 为起点的边才能开始。为了使得最后一个任务提前一天完成,至少需要多少代价。
建出最长路图,等价于不能找到一条从 \(s\) 到 \(t\) 的路径。
5. ABC263G
若不考虑 \(1+1=2\),有一个很显然的想法是把数分成奇偶两份,连边跑网络流。
现在加入了 \(T\) 个 \(1\),考虑图 \(G(\lambda)\) 表示从 \(s\) 向点 \(1\) 连了一条容量为 \(\lambda\) 的边,\(f(\lambda)\) 表示这个图的最大流,现在将题目转化成了最大化 \(f(\lambda)+\lfloor\frac{T-\lambda}{2}\rfloor\),也即最大化 \(f(\lambda)-\frac{\lambda}{2}\)。
画个图容易发现前者是一个先以斜率为 \(1\) 单增,后保持不变(因为一旦在残量网络上不连通,那么增加一条边的容量也不会使它的方向改变,所以不会再联通了),后者每次减小 \(\frac{1}{2}\),所以二分出边界就是答案了(其实可能也可以不用二分,直接在最大的地方就能求出 \(\lambda\))。
第二种方法是费用流,使得 \(1\) 的费用比其他都大即可。
6. P3731
最大匹配取交集,之前做过完美匹配取并集(POJ-1904)。
若完美匹配取交集,只需要给匹配边连反向边,其他边连正向边,并不需要构建网络,这是因为完美匹配一定改变的点是两两对应的。
而最大匹配不同,若只在二分图上连边而不借助源汇点,会出现 \((x,y_1)\) 可以调整成 \((x,y_2)\),初始 \(y_2\) 不存在匹配,此时 \(x\) 与 \(y_2\) 并不在一个强连通分量里导致没法调整的情况。
于是需要借助残量网络,若 \((x,y)\) 在所有的最大匹配中,当且仅当 \(x,y\) 在残量网络中不属于同一个强连通分量。
证明就是如果在同一个强连通分量里,必然可以通过这个环进行调整。
7. 分数匹配问题
对于二分图 \(G=(V,E)\),给每条边规定一个实数权值 \(0\le e_{x,y}\le 1\),要求对于每个点 \(x\),\(\sum_y e_{x,y}\le 1\),对于每个 \(y\),有 \(\sum_x e_{x,y}\le 1\),最大化 \(\sum e_{x,y}\)。
容易发现可以建出一张网络,该问题的一个解一定是这张网络的一个流。
引入整数流定理:对于任意一张容量均为整数的网络,一定存在最大流使得每条边的流量均为整数。
于是只需要对这张网络跑最大流就可以得到原问题的答案了。
8. 周期任务安排
有 \(n\) 种任务,每 \(p_i\) 天必须执行一个 \(i\) 任务,每天只能执行一种任务,判断是否有一种安排的方案。
记 \(L=\operatorname{lcm}(p_i)\),则有解的充分条件是 \(\sum \frac{1}{p_i}\le 1\),接下来证明它的必要性。
将 \(i\) 拆成 \(\frac{L}{p_i}\) 个左部点,第 \(j\) 个点向 \([(j-1)\times p_i+1,j\times p_i]\) 中的右部点连边共 \(p_i\) 条,容量为 \(1\),同时源点连出的每一条边与汇点连入的每一条边容量都为 \(1\),若最大流使得 \(s\) 到所有左部点都满流,则说明有解。
考虑一组可行流构造,使 \(p_i\) 拆出的点连出去的 \(p_i\) 条边,每条边的流量为 \(\frac{1}{p_i}\),这样流到右部点的流量不会超过 \(\sum \frac{1}{p_i}\),所以到汇点的流量不会超过 \(1\),故是可行流。
根据整数流定理,一定存在一组整数解能达到最大流。
9. 最小割唯一性判定
判断一张图最小割是否唯一。
将最大流的残量网络 \(G=(V,E)\) 上 \(s\) 可达的点集记作 \(S\),可达 \(t\) 的点集记作 \(T\),最小割唯一当且仅当 \(S\cup T=V\)。
因为已经是最大流了,所以不存在增广路,故 \(S\cap T=\varnothing\)。
对于任意一个最小割 \((U,\overline U)\),一定有 \(S\subseteq U\wedge T \subseteq \overline U\),若 \(|S\cup T|<n\),则一定可以将 \(V\oplus S\oplus T\) 的点同时划到 \(S\) 或 \(T\) 中,即不唯一。
现只需要证明的是对于一张图跑完任意最大流的残量网络,\(S\) 和 \(T\) 相同。
可以给出一个基于环流的证明,留坑再说吧(你又)。
由此引申出如下两题。
- 判断原图每条边 \((x,y)\) 是否在每个最小割中
结论:只有 \(x\in S\wedge y\in T\) 时才可以保留。
其他情况均可以选择 \((S,\overline S)\) 或 \((\overline T,T)\) 作为一组割。
- 判断原图每条边 \((x,y)\) 是否存在于一个最小割中
结论:当且仅当在残量网络 \(G_f\) 中 \(x\not\leadsto y\),且 \(x\notin T\wedge y\notin S\)。
必要性证明就是选出 \(s\) 和 \(x\) 能到的点集 \(U'\),将 \((U',\overline{U'})\) 作为一组割,容易发现因为 \(x\not\leadsto y\wedge y\notin S\),所以 \(y\in \overline{U'},T\subseteq\overline{U'}\),故 \((x,y)\) 在这组最小割里。
至于充分性,我们从逆否命题的角度进行证明。需要证明三个条件满足其一就不会在最小割里。
-
\(x\leadsto y\):若 \(x\in U\),则 \(y\in U\);若 \(x\in \overline U\),则 \(y\in \overline U\),所以不会在最小割里。
-
\(x\in T\):进而得出 \(x\in \overline U\),故 \(x\notin U\),无论如何都不会在最小割里。
-
\(y\in S\):同 \(2\)。
该结论也可以转化为当且仅当在残量网络 \(G_f\) 中 \(x,y\) 不在同一个强连通分量里,且 \(x\notin T\wedge y\notin S\)。
10. 最大密度子图
给定无向图 \(G=(V,E)\),其子图记为 \(G'=(V',E')\),在所有子图构成的集合中,密度 \(D=\frac{|E'|}{|V'|}\) 最大的元素称为最大密度子图。
发现可以建出一张网络,把边当成节点(左部点),从源点向这些点连接容量为 \(1\) 的边,右部点则为 \(G\) 中的点,一条 \(E\) 中的边 \(i\) 连接 \((x_i,y_i)\),则从左部点连出去两条边向右边的 \(x_i,y_i\),容量为 \(\infty\),右部点向汇点连边,容量为 \(\lambda\)。
有定理:若对于 \(G\) 的最大密度子图,有 \(D\le \lambda\)(1),当且仅当存在一种分配方案,使得将左部点看成资源(单位 \(1\) ),分给右部点后收益均不超过 \(\lambda\)(2),进一步等价于网络 \(G(\lambda)\) 最大流流量为 \(|E|\)(3)。
若证明该定理,则可以二分 \(\lambda\),判断流量是否达到上限来求解。
证明(2)与(3)等价较为容易,因为从右部点流出的流量均不超过 \(\lambda\) 保证了这是一组可行流。
现从逆否命题的角度考虑证明(1)是(2)的充要条件。
- 必要性:存在 \(D>\lambda\) 时,不存在一种合法分配方案。
proof. \(D=\frac{|E'|}{|V'|}>\lambda\),仅考虑这个子图有流量,则一定有一个点的流入流量超过 \(\lambda\)。
- 充分性:若不存在一种合法分配方案,则存在 \(D>\lambda\)。
proof. 不存在合法分配方案等价于没有流量为 \(|E|\) 的最大流,也即没有大小为 \(|E|\) 的最小割。
现在需要找到一个点集 \(x\),取两端都在该点集中的边,为边集 \(E(x)\),使得 \(\frac{|E(x)|}{|x|}>\lambda\)。
有引理:存在最小割 \((U,\overline U)\),使得 \(U\) 中有 \(s\)、\(x\) 集合的右部点,\(E(x)\) 集合的左部点。
proof. 由于最大流没有到达 \(|E|\),所以一定会有左部点被加进 \(U\),从而把它连接的右部点也加入 \(U\),假设被加入的右部点为点集 \(x\),则被加入的左部点集合一定是 \(E(x)\)。
证明了该引理,我们发现该最小割的大小就是 \(U\) 到 \(\overline U\) 的边的容量,假设被加入的左部点集合大小为 \(|E(x)|\),因为只会存在 \(s\) 到 \(\overline U\) 和 \(U\) 连到 \(t\) 的边,故容量为 \(|E|-|E(x)|+\lambda|x|\),而又因为最小割大小严格小于 \(|E|\),故可以得到 \(\frac{|E(x)|}{|x|}>\lambda\)。
11. 最大闭合子图
有依赖的物品选择。
具体做法:
构造一个新的流网络,从源点 \(s\) 向原图中所有点权 \(v>0\) 的点建一条容量为 \(v\) 的边,从 \(v<0\) 的点向 \(t\) 建一条容量为 \(-v\) 的边,原图中各点之间的连边容量均为 \(\infty\) 。
求从 \(s\) 到 \(t\) 的最小割 \((s\cup A,t\cup \overline A)\),\(\sum_{v>0} v- (s\cup A,t\cup \overline A)\) 就是答案,\(A\) 就是一个最大闭合子图。
P4174 有复杂度更低的做法,不过需要注意容量始终为非负。
证明。
12. 二分图最大权独立集/最小权点覆盖
只需要解决最小权点覆盖问题,因为最大权独立集 \(=\) 总点权 \(-\) 最小权点覆盖。
我们默认点权均为正数,因为如果有非正数可以贪心地全选。
有两种方法,由于第二种是先转闭合子图再转最小割,与第一种做法等价,故在此不作赘述。
构造网络 \(G\),左部点向右部点连边,流量为 \(\infty\),源点向左部点连边,容量为左部点点权,右部点向汇点连边,容量为右部点点权。
可以证明 \(G\) 的最小割就是原图的最小权点覆盖。
13. 无源汇环流
一张有向图,每条边有容量,有两类点,第一类点净流出不能超过点权,第二类点净流入恰好等于点权,构造可行方案。
转网络流,建立源汇,超级源点向第一类点连边,容量为点权,第二类点向汇点连边,容量为点权,跑最大流检查是否流向汇点的流量都流满了。
14. 上下界网络流
无源汇上下界可行流较为容易,考虑先消除下界的影响,我们把 \([l,r]\) 的流量限制区间变成先强制流 \(l\) 的流量,剩下可以流的区间就变成了 \([0,r-l]\),这样就把下界消除了。
考虑一个点的净流量,即净流入与净流出之差,根据正负性决定是源点连向该点还是该点连向汇点,最后检查最大流是否满流即可。
有源汇上下界可行流则考虑从汇点向源点连一条容量限制 \([0,\infty]\) 的有向边,于是转换成无源汇上下界可行流。
有源汇上下界最大流则先找到网络上的任意一个可行流。如果找不到解就可以直接结束。
否则考虑删去所有附加边之后的残量网络,在此基础上从源点跑最大流,得到的结果与可行流相加即为答案,由于现在的残量网络已经是可行流,那么增广一条路一定使经过的所有点净流量不变。
有源汇上下界最小流则从汇点出发跑最大流,可以理解为每次退流。
15. 度数平衡问题
给定有向图 \(G=(V,E)\),现在删掉一些边,使得对于每个 \(x\in V\) 满足 \(x\) 的出度与入度之差在 \(l_x\) 到 \(r_x\) 之间,构造方案。
将每条图中的边看成容量为 \(1\) 的网络上的边,使 \(1\) 表示这条边保存,否则表示被删掉。
现在题意转化成了一个点的净流出的流量在 \([l_x,r_x]\) 中,根据正负从超级源点和汇点连边即可。
具体地,若 \(l_x>0\wedge r_x>0\),就从源点连一条 \([l_x,r_x]\) 的边,表示这个点要运走 \([l_x,r_x]\) 的流量;若 \(l_x<0\wedge r_x<0\),则从该点向汇点连一条 \([-r_x,-l_x]\) 的边;否则 \(l_x<0\wedge r_x>0\),则同时建源点到该点的边或者该点到汇点的边,表示这个区间都可以,既可以净流出也可以净流入。
16. 混合图欧拉回路
对于一个点 \(x\),先给所有无向边钦定一个方向,进行网络流,若有边流量为 \(a\) 指向 \(x\),有边流量为 \(b\) 从 \(x\) 流出,还另有一条原图的有向边流入 \(x\),则需要保证 \(a+1=b\),同时有 \(a,b\in\{ 1,-1 \}\),容量不能为负,可以通过线性变换将转变为 \(\{ 0,1\}\),剩下的用源汇点补齐就可以了。
已知了所有无向边的方向,最后跑一次有向图欧拉回路即可。
17. P6517
如果不存在不能同时上下或左右的限制,可以直接根据奇偶性分成左右两部点,源点向左部点连边,右部点向汇点连边,容量均为这个点的连边数限制 \(k\),中间就根据是否相邻连边即可,容量为 \(1\),有解就是满流。
加上不能同时选上下的限制,可以将一个 \(k=2\) 的点拆成两个点,上面点表示选择了上下,下面点表示选择了左右,这样满流就相当于一定从上下中选择了一个,从左右中选择了一个,右部点同理,因为上下关系的两个点一定都连接上下点。
18. CF1773D
记原图的空位置可以放置 \(t\) 个多米诺骨牌,则一定横纵坐标和为奇数和偶数的点的数量相同,则同时选择奇数点和偶数点都会导致无解,即若 \(2\times C_{t}^{2}\ge 10^6\),可以直接输出。
所以有 \(t\le 10^3\)。
问题变成了原二分图有完美匹配,删掉多少个点对可以使得剩下的点还能形成完美匹配。
朴素的做法是 \(O(t^3)\) 的,考虑优化。
先求出一组完美匹配,若点对在这组完美匹配上有连边,则同时删掉一定合法,故考虑两个点不在当前的完美匹配中。
假设最后删掉的点是 \(x\) 和 \(y\),记初始完美匹配中有边 \((x,b)\) 与 \((a,y)\),则删除后存在完美匹配当且仅当存在 \(a\) 到 \(b\) 的增广路。
于是枚举 \(y\),计算有多少个 \(x\) 等价于求从 \(a\) 出发,将 \(a\) 视作未匹配点,能找到多少个长度为奇数的交错路,这条交错路的终点就可以作为 \(b\),\(b\) 在初始匹配中的匹配点就可以作为 \(x\)。
19. CF1510B
将子集的包含关系视为偏序关系。
形成了一张有向无环图,将选择的一条路径的权值定义为这条路径上最后一个点中 \(1\) 的个数 \(+1\),则问题转化成了选择若干条可以相交的路径覆盖所有的点,路径有权值,最小化权值和。
当然可以使用二分图最大权匹配,匹配一次就相当于连接了两条路径,只需要使得有出边的点权值和尽量大即可。
但这并不足以通过此题。
考虑不使用匹配,使用一种贪心算法。
因为边权非常特殊,我们考虑贪心的从大到小加入左部点进行匹配,由于一个已经匹配的点不会再失配,所以这样的贪心可以保证对于一组最优解不会存在从大到小第一个不一样的位置上贪心解没有匹配的情况。
而如果最优解比贪心更优,尽可能因为其选择了一些小的点加和最大,但此时我们可以调整使得贪心也选择了这些点,并且匹配数相同,因为其存在第一个不一样的地方贪心更大,所以方案更优,假设不成立。
20. CF793G
空格矩形连边相同,线段树优化建图。
21. 上下界最小费用最大流
仍然使用上下界可行流的方法,先求出一组最小费用的可行流,接着去掉超级源点和汇点,从起点开始接着残量网络上跑最小费用最大流就可以了。
22. P4068
根据质因数个数建二分图,中间的连边有费用,容易发现每次选择一条费用最大的流使得流量增加,费用的和一定呈现先递增后递减的趋势,于是每次找一条最大费用的增广路直到费用之和小于 \(0\)。
23. P2469
有两种做法,第一种是 link,此时跑最小费用最大流就是对的,因为 \(y \rightarrow t\) 的边全部满流意味着对于一个点来说只有和前面的链并起来以及自己作为一个开头两种情况。
第二种则是拆点,连接 \(x_u,y_v\),边权为 \(w-a_v\),表示如果将这条边选中,则代表 \(v\) 并到了前面,初始答案为 \(\sum a_i\)。
此时只需要求最小权匹配,应该可以用 KM 算法。
24. P4249
很有启发意义的一道题。
考虑不是三元环的图一定有一个点出度为 \(2\),同时还有一个点入度为 \(2\),所以对于点 \(x\),损失的三元环就是 \(deg_x\choose 2\) 个,其中 \(deg_x\) 为 \(x\) 的出度。
给每个无向边定向,发现一个点增加一个出度,就会损失已经存在的出度个三元环,考虑一种建图方式为,无向边为左部点,原图的点为右部点,每条无向边连向两个点,流量为 \(1\),费用为 \(0\),而右部点连向 \(t\) 则是最巧妙的地方,因为每次增加的费用是一个函数,所以可以直接连 \(n-1\) 条边,每条边的费用依次递增,至于一开始有出度的点只需要使得初始费用改变即可,或者在左部点连接右部点时只连一条边。
25. 均衡有向图
有向图 \(G=(V,E)\),删掉至多 \(k\) 条边,最小化 \(\max_v|deg_{out}(v)-deg_{in}(v)|\)。
二分答案 \(\lambda\),有 \(|deg_{out}(v)-deg_{in}(v)|\le \lambda\),考虑检查是否合法,若保留了 \(t\) 条边,则有合法解当且仅当 \(|E|-t\le k\)。
所以只需要使得保留的边尽可能多。
每条边有容量 \(1\) 以及费用 \(1\),若取 \(1\) 则代表保留这条边,至于度数的平衡,可以参考 15 题。
剩下的跑最大费用最大流就好了。
26. CF818G
link。
比较有启发性的优化是如果一些点都连向的点集是包含减少的,可以直接连后一个点,走高速公路过去。
该题不能使用一个点作为中间节点的原因是每个点连向的点集并不是相同的,有可能出现向前连边的情况。
27. AGC034D
最大收益是关键,朴素的边数是 \(n^2\) 的,考虑绝对值的 trick,把绝对值拆成四个式子取最大值,于是跑最大费用最大流即可。
28. CF739E
和 P4249 套路相同,左部点为 \(A\) 与 \(B\) 分别表示两种球,从 \(s\) 到两个点的容量为个数,右部点为每个宝贝,如果同时选择两种,收益为 \(p+q-pq\),所以连接两条右部点到 \(t\) 的边,容量均为 \(1\),第一条费用为 \(0\),第二条费用为 \(-pq\)。
另外,还有一种模拟费用流的做法。
考虑同样的建图,每次的增广只有四种情况:
- \(s\rightarrow A\rightarrow i\rightarrow t\)
表示新增一个用 \(A\) 控制的点,\(i\) 从无 \(A\) 变成有 \(A\),可获得的代价为 \(p_i\),若 \(i\) 之前被 \(B\) 控制过,则代价为 \(p_i-p_iq_i\)。
- \(s\rightarrow B\rightarrow i\rightarrow t\)
同理,\(i\) 从无 \(B\) 变成有 \(B\)。
- \(s\rightarrow A\rightarrow j\rightarrow B\rightarrow i\rightarrow t\)
表示 \(j\) 从有 \(B\) 无 \(A\) 变成有 \(A\) 无 \(B\),\(i\) 从无 \(B\) 变成有 \(B\)。
\(j\) 提供的代价为 \(p_j-q_j\)。
- \(s\rightarrow B\rightarrow i\rightarrow A\rightarrow j\rightarrow t\)
同理,\(j\) 提供的代价为 \(q_j-p_j\)。
于是很清晰,只需要开四个堆维护从无 \(A\) 变成有 \(A\)、从无 \(B\) 变成有 \(B\),从有 \(A\) 无 \(B\) 变成有 \(B\) 无 \(A\) 以及从有 \(B\) 无 \(A\) 变成有 \(A\) 无 \(B\),这样时间复杂度就变成 \(O(n\log n)\),注意每种情况的发生条件还有是否从 \(s\) 出来还有流量。
29. ABC332G
二分图,左部点为球,共 \(n\) 个,右部点为盒子,共 \(m\) 个,朴素最大流边数太多,考虑转成最小割解决。
取答案最小割中 \(s\) 所在集合的左部点集合为 \(P\),\(t\) 所在集合的右部点集合为 \(Q\),则答案为 \(\sum_{i\notin P} a_i+\sum_{j\notin Q} b_j+\sum_{i\in P,j\in Q} i\times j=\sum_{i\notin P} a_i+\sum_{j\notin Q} b_j+(\sum_{i\in P} i)\times (\sum_{j\in Q}j)\)。
枚举 \(\sum_{i\in P} i=k\),只有 \(n^2\) 种取值。
于是答案变成 \(\sum_{i\notin P} a_i+\sum_{j\notin Q} b_j+\sum_{j\in Q}j\times k=\sum_{i\notin P} a_i+\sum_{j}\min(b_j,j\times k)\),此时可以拆成两部分,\(\sum_{i\notin P} a_i\) 可以用背包解决,剩下的则对于每个 \(k\) 预处理一下值即可(类似前缀加等差数列)。
30. ARC106E
二分天数 \(d\),上界为 \(2nk\),具体证明可以使用整数流定理。
即对于每条左右部点中间的边,流量为 \(\frac{1}{n}\),则若有 \(2nk\) 个左部点,其中一半的点可以向每个右部点流出 \(\frac{1}{n}\) 的流量,于是右部点得到的流量为 \(k\)。
此时直接跑网络流复杂度有些高,考虑 \(n\) 很小,可以枚举最小割的 \(S\) 中的右部点集合 \(P\),左部点集合 \(Q\) 的连边全都在 \(P\) 中,答案为 \(|P|\times k+d-|Q|\)。
现在只需要对于一个集合 \(P\),求出有多少个点的连边都在 \(P\) 中,可以做高维前缀和,预处理左部点的邻域,时间复杂度可以达到 \(O(n^2k+2^nn\log nk)\)。
31. CF1517G
容易发现一个平行四边形走的四个点可以写成形如 \((E,O)\rightarrow(E,E)\rightarrow (O,E)\rightarrow(O,O)\) 的一条路径(\(E\) 表示为偶数,\(O\) 表示为奇数)。
所以把所有帐篷分成四类点,\(s\) 向 \((E,O)\) 点连边,\((O,O)\) 点向 \(t\) 连边,成为 \(3\) 的破坏连通性问题,但是本题的权值在点上而不是边上,所以把一个点拆成两个点中间连一条边,容量为原点权,其他边容量为 \(\infty\),最大流即可。
32. BZOJ3218
绝世好题!!!太牛,太牛,话说最小割题好像都挺牛的。
拆式子,题目需要最大化 \(\sum_{i\in W} w_i+\sum_{i\in B} b_i -\sum_{i\in P} p_i\),有减法和最大化不太好做,考虑取反,即最小化 \(\sum_{i\in P} p_i+(\sum w-\sum_{i\in W} w_i)+(\sum b-\sum_{i\in B} b_i)-\sum w-\sum b=\sum_{i\in P} p_i+\sum_{i\in B} w_i+\sum_{i\in W} b_i-\sum w-\sum b\)。
由于最后两项都是定值,只需要最小化 \(\sum_{i\in P} p_i+\sum_{i\in B} w_i+\sum_{i\in W} b_i\)。
最小割,使 \(S\) 集合包含 \(s\) 和白点,\(T\) 集合包含 \(t\) 和黑点,对于 \(s\) 到所有点的边,容量为 \(w_i\),所有点到 \(t\) 的边,容量为 \(b_i\)。
此时一个割就对应着 \(\sum_{i\in B} w_i+\sum_{i\in W} b_i\),考虑如何才能加上 \(p\) 的贡献。
对于 \(i\in B\),若 \(\exists \ j \in W\wedge j< i \wedge a_j\in[l_i,r_i]\),那么有 \(i\in P\)。
所以将 \(i\) 分裂出一个点 \(i'\),连接 \(i'\rightarrow i\),容量为 \(p_i\),若 \(j\) 满足限制,就连接 \(j\rightarrow i'\),容量为 \(\infty\),表示割不掉这条边,有多个 \(j\) 就连多条边。
于是 \(p\) 的贡献就已经被考虑进去了,因为若割掉 \(i'\rightarrow i\),当且仅当 \(i\in B\wedge j\in W\)。
但此时边的数量很多,考虑线段树优化建图,从小到大加入点,先用该点 \(i\) 的区间 \([l_i,r_i]\) 查询,再加入 \(a_i\)。
我们可以直接把 \([l_i,r_i]\) 的 \(\log\) 个节点连向 \(i'\),再从 \(i\) 连向 \(a_i\),但此时无法满足 \(j<i\) 的限制,考虑使用可持久化线段树,每次新加入一个 \(a_i\) 时就增加一条链,但需要注意这条链不是普通的可持久化线段树一样连接儿子,而是直接从原来的节点连向复制出来的节点。
这样就保证了所有的 \(j\) 都能连到 \(i'\) 上,点数和边数都是 \(O(n\log n)\) 级别的,可以通过。
33. CF1630F
给边定向,从大到小,形成了 DAG,由于不存在三角形,所以不会有一个点既有入度又有出度,故拆点,\(x\) 表示这个点有入度,\(x'\) 表示这个点有出度,给矛盾的点连边,求最大独立集就可以了。
首先 \(x\rightarrow x'\),若原图存在边 \(x\rightarrow y\),则连接 \(x\rightarrow y\),\(x'\rightarrow y'\) 以及 \(x\rightarrow y'\)。
我们发现这样形成的一张图仍然是一组具有偏序关系的 DAG,其最大独立集为最长反链长度,转成匹配即可解决。
34. P2050
等待时间之和最小,考虑每次做的菜品会给总等待时间增加多少。
假设一个厨师最后做了 \(k\) 个菜品,分别是 \(a_1,a_2,\cdots,a_k\),则总等待时间为 \(a_1\times k+a_2\times(k-1)+\cdots +a_k\),贪心地考虑将花费时间较小的菜品放在前面制作,于是制作一定连续。
所以将一个厨师拆成 \(p\) 个点,第 \(k\) 个点表示该厨师倒数第 \(k\) 次制作,菜品 \(i\) 向厨师 \(j\) 的第 \(k\) 个点连边,容量为 \(1\),费用为 \(t_{i,j}\times k\),这样跑最小费用最大流就可以了。
但是点数和边数还是很多,无法通过。
所以动态加点,容易发现只有 \(j\) 的第 \(k\) 个点有流量了,才会考虑加入第 \(k+1\) 个点,我们可以在跑 EK 算法的过程中直接找到点,或者跑完 Dinic 检查有多少个 \((j,k)\) 到汇点 \(t\) 满流了。
35. P1251
直接跑最小费用最大流错了,因为该题并不是最大流,而只是要求每天拆出来的边满流。
可以用上下界网络流来做,也可以把天数之间的边的费用变成 \(-\infty\),这样如果最短路长度非负就一定不含中间的边了。
36. 区间图着色
给定 \(n\) 个区间,要求相交的区间颜色不相同,构造方案。
网络流来做就是将一个区间向可以染相同颜色的后面区间连边,求最小路径覆盖。
可以使用 dilworth 定理变成最长反链,即最大团(两两都相交等价于全都有交)。
此时答案就是覆盖区间最多的点,如果需要构造方案,可以直接贪心,按照左端点排序,用优先队列维护当前颜色的右端点,加入一个区间检查是否还有闲置的颜色,若没有就新增一种颜色。
37. 平面图对偶
例题,把点和面进行对偶,最小割就可以被转化为最短路了。
38. P2517
网络流解法较为平凡。贪心没听懂,欠了两个题,还有一个是最小割负容量的题,再说吧,留坑。
39. 有向图邮递员问题
给定带权有向图 \(G\),求出一个回路使得每条边至少经过一次,总长度最小。
只有在图连通且各点的入度与出度均不小于 \(1\) 时才有可能有解。
发现一个有向图有欧拉回路时所有点的入度与出度相等,考虑拿出来不相等的点分成二分图连边,容量为 \(1\),费用为长度,跑最小费用最大流即可,若不是满流则无解。
40. CF730I
一道很适合作为模拟费用流入门的题目。
首先朴素网络流的建模较为简单,左部点放每个人,右部点有两个,分别代表足球和篮球,
中间的连边容量为 \(1\),费用为 \(a_i,b_i\),右部点到 \(t\) 的连边容量为 \(p\) 和 \(s\)。
跑流为 \(k\) 的最大费用最大流即可。
若想做到更好的复杂度,可以手动模拟费用流的增广过程。
容易发现每次的增广只有四种情况:
-
新增一条经过编程的流 \(i\),收益为 \(a_i\)。
-
新增一条经过体育的流 \(i\),收益为 \(b_i\)。
-
编程的流已经满了,将经过编程的一个流 \(j\) 调整成经过体育,再把当前经过编程的流 \(i\) 加上,收益为 \(a_i-a_j+b_j\)
-
体育的流已经满了,将经过体育的一个流 \(j\) 调整成经过编程,再把当前经过体育的流 \(i\) 加上,收益为 \(b_i-b_j+a_j\)。
开四个堆,分别维护一下为加入点 \(i\) 的 \(a_i\) 和 \(b_i\),以及加入编程社团的点 \(j\) 的 \(b_j-a_j\),以及加入体育社团的点 \(k\) 的 \(a_k-b_k\)。
每次加入按情况取最大值即可。
41. 最大费用流
之前学的是最小费用最大流或者最大费用最大流,前提保证都是最大流,但现在需要求的是任意流下的最大费用。
考虑如何判定一组流是否是当前流量下的最大费用,当且仅当此时不存在正环。
加强限制,判定一组流是否是该网络下任意流的最大费用,有定理当且仅当残量网络上不存在正环、正的 \(s\leadsto t\) 的路径以及正的 \(t\leadsto s\) 的路径。
不会证,留坑等 noi 完了再说吧。
例题:link。
其实是反悔贪心的题,模拟费用流的过程,增量贡献。
42. 不知名分配问题
有 \(m\) 个物品,\(n\) 个人,\(01\) 矩阵 \(A_{i,j}\) 表示物品 \(i\) 是否能给人 \(j\),令 \(h_i\) 表示人 \(i\) 得到的物品个数,构造全部分完的分配方案,最小化 \(\sum_{i,j}|h_i-h_j|\)。
令 \(\pi\) 表示一种分配方案,\(td(\pi)\) 表示该方案下 \(\sum_{i,j}|h_i-h_j|\),新定义函数 \(ss(\pi)\) 表示该方案下的 \(\sum_i (m+1)^{h_i}\),有定理在 \(ss(\pi)\) 取到最小值时,\(td(\pi)\) 也为最小值。
先来考虑如何求出 \(ss(\pi)\) 的最小值,可以用连多条边的 trick,每个人连接 \(t\) 的 \(m\) 条边的费用依次为 \((m+1),(m+1)^2-(m+1),(m+1)^3-(m+1)^2,\cdots\),这样跑一个最小费用最大流即可。
现在证明该定理,定义平衡操作 \(B\) 为调整满足 \(h_i>h_j+1\) 的点对 \(i,j\) 的物品个数,使得 \(h_i\gets h_i-1,h_j\gets h_j+1\)。
容易发现如果能进行 \(B\) 操作,则 \(td(\pi)\) 与 \(ss(\pi)\) 都会变小。
同时可以发现 \(ss(\pi)\) 不能变小当且仅当不能进行 \(B\) 操作,另一方面可以用负环证明。
而又有 \(ss(\pi)\) 的每个数值一定对应唯一的一种分配方式,所以在最低点时一定得到了确定的方案。
感觉这个证明有点纰漏,再说吧。
注意到 \(ss(\pi)\) 和 \(td(\pi)\) 并不存在数值上的对应关系,也即它们的单调性和非最小值的极值都不相同,只有在最小值时是相同的。
43. LP-duality 定理
线性规划会不了一点啊!!1
求最大的 \(c^Tx\),其中 \(A\) 为给定的 \(m\times n\) 的矩阵,\(\overrightarrow{b}\) 为给定的长为 \(m\) 的向量,\(c\) 为给定的长度为 \(n\) 的向量,\(x\) 为所求的长为 \(n\) 的向量。
该问题可以对偶成:
求最小的 \(b^Ty\),变量含义与上面相同,\(y\) 为长为 \(m\) 的向量。
剩下的看同学写的,懒得抄一遍了,内容也包含了最大流最小割定理的证明。
应用:

浙公网安备 33010602011771号