网络流相关

最大权闭合子图

对每个正权点,从源点连容量为边权的边;对每个负权点,连容量为边权绝对值的边向汇点,图上原有边容量为 \(\infty\)。把新图划分成两个部分,考虑割某些新边,最终和源点在一个部分的就是要选的点。由于我们不割原图,所以这样做满足闭合子图要求。先假设选上了所有正权点,当我们选上一个负权点的时候,要切断它和汇点的边,损耗增加;当我们放弃一个正权点的时候,要切断它和源点的连边,损耗也增加,因而最终的答案就是所有正权点的权值和减去新图的最小割。

[ARC085E] MUL

打碎 \(x\) 就必须打碎 \(x\) 的所有倍数的宝石,按照规则连边,点权取反之后做最大权闭合子图。

最小路径覆盖

用若干个点不交的路径覆盖 DAG 上所有点。

你发现要求是每个点至多只有一个入度和一个出度。初始时一个合法方式是每个点都是一个路径,选择一条边可给两个点分别增加一个入度和一个出度,并减少一个路径。考虑拆点形成二分图,一条原图上的边对应一条从左部点到右部点的边,需要保证每个拆后的点只被一条边选中。跑二分图最大匹配即可。

P2764 最小路径覆盖问题

输出方案可以参照残量网络求出哪些点在同一条路径上,同一路径上的按拓扑序输出即可。

偏序集的最小链覆盖与最大反链

由 dilworth,上述两个相等。偏序集(DAG)上的链不要求一一相邻,于是我们先跑传递闭包,一个点连向自己所有可比的点,于是将最小链覆盖转为最小路径覆盖。

广义切糕

\(n\) 个变量,取值范围是 \([1,m]\),第 \(i\) 个变量取 \(j\) 的代价是 \(a_{i,j}\),有 \(l\) 个限制形如 \(x_{u}\le x_v+d_i\),求最小代价。考虑最小割,每个变量构建 \(m+1\) 个点并形成链,记每一个点为 \((i,j)\),则第 \(i\) 个变量选了 \(j\),等价于割去 \(((i,j),(i,j+1))\)。除开源汇点的连边外,再连容量无穷大的反向边 \(((i,j+1),(i,j))\)。对于每个限制,我们对每一个值 \(j\) 连边 \(((u,j),(v,j-d_i))\)。不难发现最小割即为答案。

引理:一条边 \((u,v)\) 作为最小割的割边的必要条件是删去最小割里的所有边之后,\(S\) 仍然可达 \(u\)\(t\) 仍然可达 \(T\)

[P3227 HNOI2013]切糕 建图证明 - 洛谷专栏 证明了正确性,以及在 \(d>0\) 时不需要反向边,否则需要反向边。

P10129 「Daily OI Round 3」City Planning

分左右部点的城镇分别考虑。发现在值域内选数类似切糕,于是左部点每个城镇从 \(s\) 引出 \(k\) 个点 \(k,k-1,\dots,1\),每个点之前的那条边权代表选择 \(c\) 作为那个点的代价;右部点每个城镇构造一条链 \(1,2,\dots,k\) 并最终引向汇点,每个点之后的那条边权代表选择 \(c\) 作为那个点的代价。

然后考虑补偿费。对于每个管理枚举每对有高铁连接的城镇 \((u,v)\),设 \(u\) 为其左部点。再设 \(i,j\)\(u\) 中这个管理管辖的道路链接的两个村,则这条道路被修复当且仅当 \(c\geq \max(i,j)\)。因此我们从 \(u\)\(\max(i,j)\) 连边向 \(v\)\(\max(i,j)\),不难发现当两侧的 \(c\) 选择都不满足条件时,这条边就必须割去。因此在图上跑最小割即可。

关于一条链上不可能有两条边同时被割去的证明,利用上述引理是显然的。

[ARC142E] Pairing Wizards

不难发现这是一个变量定值问题,考虑切糕。问题出现在直接切糕是难以表示或的条件的。先进行一些简化。

首先,对于一个 pair \((x,y)\),我们先将 \(a_x,a_y\) 抬升至 \(\min(b_x,b_y)\) 的位置。此时考察每一个 \(i\),存在 \(a_i<b_i\)\(a_j\geq b_j\) 两种情况。去掉所有已经合法的 pair 之后,现在只剩下一个 \(a_x<b_x\),一个 \(a_y\geq b_y\) 的情况,且一定有 \(b_x>b_y\)。此时有两个选择:让 \(a_x=b_x\) 或者 \(a_y\) 抬升到不小于 \(b_x\) 的位置。注意到 \(a_x\) 要变化,则一定只会变到 \(b_x\)。因此考虑对 \(x\) 一类的点建立一个点,从源点连一条 \(b_x-a_x\) 的边,割去表示选择;对 \(y\) 类点做切糕,若不割 \(x\) 对应边,则 \(y\) 必须不小于 \(b_x\),因此从 \(x\)\((y,b_x)\) 连一条容量为 \(\infty\) 的边。切糕之间 \((y,i)\to (y,i+1)\) 的边权为 \(i-b_y\),不合法情况要设为 \(\infty\)。跑最小割即可。

[ARC129E] Yet Another Minimization

考虑最朴素的切糕,每条链开 \(10^6\) 个点。为了表示 \(|x_i-x_j|\times w_{i,j}\),我们可以在每一个对 \((i,v),(j,v)\) 之间连权值为 \(w_{i,j}\) 的双向边,即可表示这个差的绝对值。一条链上只会割一个点的正确性不难证明。

考虑离散化。你发现一个点,若其后方接的出边权值为 \(+\infty\),则在这个点引出的链间边等价于从下一个点引出。因此一条链上只有 \(O(m)\) 个有效点。我们在链头和链尾建一个引出 \(\infty\) 的点,中间只保留 \(m\) 个点,在 \(i\to j\) 连边的时候,把 \(i,j\) 的关键点取出来排序,每个左开右闭段内的连边是相同的,找到 \(i\)\(j\) 在该段下一个关键点即可完成连边。这样点数是 \(O(nm)\),边数是 \(O(n^2m)\),不难通过。

上下界网络流

无源汇上下界可行流

先令每条边的流量为 \(L_i\),此时的点会有正的或负的流量缺口。我们构建另一张图补全缺口,即设当前每个点的入流减出流为 \(w_i\),若 \(w_i>0\),则需要有额外东西把它接走,从源点向他连边来表示这个流;否则连向汇点表示送出去的下界流。然后再这个图上跑最大流,只有每个点的补充边流满才合法。最后每个边的流量就是下界加上新图上的流量。新图边的容量应为 \(R-L\)

有源汇上下界可行流

新加边 \(t\to s\),界为 \((0,\infty)\),跑无源汇上下界可行流。答案为新加边上的流量。若求有源汇上下界最小费用最大流,将上面最后跑的最大流改为费用流即可。

有源汇上下界最大流

在跑完可行流的残量网络上,去掉反向边和新建的源汇,以原图的源汇直接跑最大流即可。注意不做任何上下界的变化,新图边的容量仍然为 \(R-L\)。若求最小流,仍然去掉新建源汇和反向边,然后直接交换源汇,用可行流减去当前跑出来的最大流即得到原图最小流。

P4043 [AHOI2014/JSOI2014] 支线剧情

每个点建立无上下界、花费为 \(0\) 的边流向汇点,即为有源汇上下界最小费用可行流。补流后跑一次最小费用最大流即可。

未知来源题

题意:有若干个初始独立的点,每个点上有 \(0/1\) 的标号。维护操作:在点 \(x,y\) 之间加一条边;删去点 \(x\);计数 \(x\) 所在连通块中 \(1\) 的个数。现在给出每次操作 3 的答案区间 \([l,r]\),构造一组初始编号满足区间限制,或判定无解。\(n,q\leq 2000\)

考虑建立合并树,每一次合并就新开一个节点作为原来两个连通块的父亲,显然操作 3 的限制会被加在某一些点上。那么一个点会做出贡献的位置就是叶子到某个祖先的一条链,我们希望选择若干条这样的链,使得每个点上的链数在区间内。

考虑上下界网络流,合并树上的每一个点形成一条链,初始时只有 \(1\) 个点,每次在该点处进行删除操作时,就新建一个点连回对应的叶子;添加限制时,新建一个点并将限制表示在边上。最后跑无源汇上下界可行流即可,看汇点向每个叶子的连边的流量即可构造出方案。

费用流模型

P3358 最长k可重区间集问题

区间覆盖经典模型。同一段上只能有 \(k\) 个覆盖边,对应 \(k\) 个流。离散化之后,给每个对应区间连费用为长度、容量为 \(1\) 的边,源点向开头连容量为 \(k\) 的边即可。最后是最大费用最大流,取反后无负环,直接 SPFA。

注意:此类区间覆盖模型,支持要求一段上的限制是一个区间 \([l_i,r_i]\) 且不同。可以把流量设成一个大数 \(X\),仍然连跨越边,我们要求一段上跨过的边数为 \([l_i,r_i]\),等价于要求原始边 \((i,i+1)\) 流过的流量在 \([X-r_i,X-l_i]\),跑上下界网络流即可。

P6967 [NEERC2016] Delight for a Cat

二选一的费用流首先转成全选吃饭,现在要选择某些点睡觉,每个点有对应贡献,要求满足条件。

区间内有多少个点的限制不好描述。考虑把区间建成点,则一个点对一段区间内的区间做出贡献,要求一个区间收到的贡献在 \([m_s,k-m_e]\) 范围内。这是一个区间覆盖模型,我们限制总流量为 \(k-m_e\),则上述限制转为每个原始边的流量不超过 \(k-m_e-m_s\),直接跑最大费用最大流即可。

QOJ3304. Interval Graph

【模板】原始对偶。

显然的区间覆盖模型,流量为 \(2\),但点边数量很大,达到约 \(10^6\),不能暴力 SPFA。考虑原始对偶,初始图上每个点的势能 \(h_x\) 为源点到它的最短路,求最短路时每个边权值重设为 \(co+h_u-h_v\)。增广完一轮后,新图的各点势能设为上一轮势能加上上一轮求出的最短路即可,求最短路的过程中,我们维护每个点的最短路前驱,即可从汇点倒推出一条增广路。初始图是一个 DAG,拓扑排序即可。复杂度瓶颈在 dij,为 \(O(m\log m)\)

P7730 [JDWOI-1] 蜀道难

用流来表示点值的变化、从一个点到另一个点的转移。

这一类操作复杂,要求在满足一个条件的前提下最优化的模型是可以考虑费用流的。

首先搞出差分数组,则一次操作等价于 \(d_i\) 加一,\(d_{i+l}\) 减一或反过来。一个加一,一个减一的操作等价于值的转移,可以联想到用一个流来表示一个值的转移。因此我们对差分数组上为正的所有点从源点连 \((d_i,0)\) 的边,为负的所有点连 \((-d_i,0)\) 向汇点,一个操作可以枚举每一个起点连边 \((\infty,c_i)\),跑最小费用最大流,这样一个流顺次流过的所有操作边就对于一次转移值的操作。最后判断合法性只需要看是否每个汇边都满流即可。

二分图模型

  1. 二选一问题:经典的是一个点拆成两个点当成两个选项,选了一侧的 \(A\) 就不能选另一侧的 \(B\),也即最大独立集,答案是总点数减最大匹配。这种拆点方式主要用来处理选项之间矛盾,最大化不矛盾的选项的问题。
  • 从割的角度理解最大独立集:若一个选项与源或汇的连边被割开了,则那个点不选。这样也能推出最大独立集等于总点数减最大匹配。同时,也可以构造出方案。一个点若能从 \(s\) 走有剩余容量的边(包括反向边)到达,则存在一个合法的最小割使得它与源点在同一侧,不可达点与汇点在同一侧。

P9879 [EC Final 2021] Check Pattern is Good

将横纵坐标和为奇数的位置反色,变为统计全白或全黑。对于每一个 \(2\times 2\) 的正方形开两个点,表示全部染白或全部染黑,对有可能实现的点,向源点或汇点连边。然后在互相冲突的选项之间连边。构造方案可以从源点出发走有残量的边找到所有源点部的点,其中与源点相连的左部点可选;剩余点中与汇点相连的右部点可选。将那些点对应的矩形做颜色覆盖即可。

  • 还有另一种二选一问题的建图方式:集合划分模型,直接根据一个点在 \(S\) 还是 \(T\) 表示其选了什么。这种一般用于处理多个选项之间同时被选择、不被选择、一个选一个不选等关系,选择之间没有矛盾,最大化的不是选择的个数,而是关系之间满足的权值。若有两个集合,通常构建成二分图的形式。最大权闭合子图模型是一个特殊的集合划分模型。

[ABC259G] Grid Card Game

把行和列作为点。一个基本的事实是,由于相交点权非负,故和为负的行或列是一定不选的。因此只考虑和为正数的行和列。不妨先假设所有行和列都被选择,答案是和的和,考虑把答案调整到合法的最小花费,做最小割。于是对于每一行,从源点连行值和的边;每一列,向汇点连列和的边,割去表示一行或一列不选。然后考虑相交。对于 \(a_{i,j}\geq 0\),在对应行和列之间连 \(a_{i,j}\) 的边,表示同时选的算重量;对于 \(a_{i,j}<0\),在对应行和列之间连 \(\inf\) 边,表示不能同时选。最小割即可。

[AGC038F] Two Permutations

考虑把 \(P,Q\) 的每一个置换环找出来。设 \(p_i\) 代表 \(i\)\(P\) 上对应的环是哪一个。我们不难发现每一个环只有两种操作:拆成自环或不变。会导致答案变小的限制之间是一个“两个环同时拆/不拆”的形式,考虑集合划分模型,设 \(p\) 环在 \(S\) 一侧表示不拆,否则拆;\(q\) 环相反。对每一个 \(i\) 讨论,进行下面的连边:

  1. \(i=P_i=Q_i\),则一定不合法,直接记一个贡献。
  2. \(i=P_i\neq Q_i\),则拆掉 \(q_i\) 不合法,从 \(q_i\)\(T\) 连权值为 \(1\) 的边。
  3. \(i=Q_i\ne P_i\),则拆掉 \(p_i\) 不合法,从 \(S\)\(p_i\) 连权值为 \(1\) 的边。
  4. \(i\ne P_i=Q_i\),则两者在同一集合时不合法,\(p_i,q_i\) 之间连双向边。
  5. \(i\ne P_i\ne Q_i\),则都拆时不合法,\(q_i\)\(p_i\) 连边。

这是二分图,一个连通块不与两侧同时连通时,一定可以有方案合法。这个最小割模型成立。

  1. 直接建立二分图匹配模型

P9726 [EC Final 2022] Magic

注意到区间端点互不相同。可以分类考虑三种关系:

  • 若包含,则我们希望小区间靠后选;
  • 若不交,则互不影响;
  • 若相交,则前者的 \(r\) 和后者 \(l\) 中只有一个可以有效,是一个独立集问题。也可以理解成给二分图定向,一个点有效条件是它没有出度。

首先,多一个区间一定不劣,因此包含与相交不会成环。此外,一个点定下来之后,其周围所有边方向确定,故相交区间之间一定不会形成环。于是我们把有相交限制的点之间连边,跑最大匹配即可。

由于有空间限制,我们不能把所有的 \(O(n^2)\) 条边都存下来。注意到二分图匹配的流量可以只有 \(1,0\),等价于一条边存在或不存在。于是考虑直接利用 bitset 存邻接矩阵,使用 _Find_next 找下一条边,空间即可通过。时空限制均比较紧,可以考虑用匈牙利算法,BFS 版本的效率更高。

[AGC029F] Construction of a tree

考虑使用匹配模型来构建一个点与其父亲的关系。将 \(1\) 设为未匹配点,给出 \(2\sim n\) 和每个子集并在之间连边,一个必要条件是存在完美匹配。考虑令 \(1\) 为根,每次找到 \(1\) 所处的所有集合,并将对应匹配的点设为 \(1\) 的儿子;再把这些点所处的集合找到,做相同操作......直到所有点被选完或更新不了为止。这样可以构造出二分图交错树。显然能选完就一定是一棵合法树。我们声称对于任意匹配,若发现更新不了,则通过反证或霍尔定理可知一定不合法。

优化建图的网络流

[ARC074F] Lotus Leaves

每个点拆成入点和出点,出点向同行同列的所有点连边跑最小割。这样连边是 \(O(n^3)\) 的边数,太大了。考虑给每行每列建立虚点,每行每列的对应虚点向所有入点连边,所有出点向对应虚点连边,边数就是 \(O(n^2)\) 了。

模拟费用流

经典结论:

  1. 非增量费用流中,源汇边不会退流(但不仅限于此,如增加的边的 \(co=0\) 也不会退流)。
  2. 增广路不会多次经过同一个点。
  1. 增量-最小(大)费用任意流

    每次增加一组边,考虑新增的从源到汇的负路径和新增的负环,第一种对应新增一组方案,第二种对应退掉原来的一种方案之后,将某一部分改为当前的方案。类似反悔贪心

    此类问题需要性质保证被退流的不会再重新流上,或重新流上的形式非常单一。最典型的是老鼠进洞模型的交叉不优性质,保证了退流的不会再流上,因而被反悔掉的不必再重新考虑。

P4694 [PA2013] Raper

费用流模型形如 \((S,a_i,v),(b_i,T,v),(a_i,b_j,\inf)\),其中 \(j\ge i\)。考虑模拟费用流。

wqs 二分去掉个数限制。现在每选一个匹配都会有 \(-mid\) 的贡献,我们希望最小化总费用。观察新增一个 \(a_i,b_i\) 时,新增的负路径和负环。设 \(j\le i\)

  • \(S\to a_j\to b_i\to T\),负路径,等价于新增一个 \(a_j,b_i\) 的匹配,费用 \(a_j+b_i-mid\)
  • \(a_j\to b_i\to T\to b_k\to a_j\),其中 \(k\in[j,i)\),负环,等价于把 \(a_j\to b_k\to T\) 退流,改成了 \(a_j\to b_i\to T\),也就是拆掉一个匹配,用对应的 \(a\) 来匹配新的 \(b\),费用 \(b_i-b_k\)

剩余可能的负环都包含负路径,故一定不优。上述形式实际上就类似反悔贪心。考虑用堆维护贡献,每次若贡献小于 \(0\) 就选上。

注意 wqs 二分时,可能有斜率连续相同的段,我们钦定在最小值相同时最小化选择的匹配个数,也即优先使用撤销方式进行匹配。

P6943 [ICPC2018 WF] Conquer The World

我们把边权拆到每个点上,则 \((u,v)\) 的贡献变为 \(dis_u+dis_v-2dis_{lca(u,v)}\),在 LCA 处统计答案,费用流模型比较简单。对于最大流的限制,我们给每一组匹配增加一个 \(-\inf\) 的贡献,即可将最小费用最大流转成最小费用可行流。

每次在 LCA 的位置会增加一条从往上走转向往下走的边,带花费 \(-2dis\)。考虑统计其贡献:

  • 一条负路径,等价于新增一个匹配,费用 \(dis_u+dis_v-2dis_{lca}\)
  • 一个负环,等价于退掉原来的一个匹配 \((v,k)\),换成在这个位置进行匹配,费用 \(dis_{u}-2dis_{lca(u,v)}-(dis_k-2dis_{lca(v,k)})\)

用两个堆维护从供应点往上走和往下走到需求点两种不同的贡献,钦定 \(-\inf\) 在其中的某一侧计算即可,每次成功匹配后,在 \(u\) 的堆里加入反悔代价 \(2dis_{lca}-dis_v\),另一侧同理。

复杂度据说是 \(O(t\log t)\),其中 \(t\) 是最终匹配个数。复杂度正确性似乎基于消圈?

P3826 [NOI2017] 蔬菜

考虑对每一天建立点,向汇点连 \(m\) 的边;源点对于每一种菜,都连一条边到每一天,表示当天坏掉的菜的数目以及价值;每一天向前一天连容量 \(\inf\) 的边。注意每种菜的最后一个价值加上 \(s_i\),意为只要在这一天之前卖掉它,都有额外贡献。跑最大费用任意流即可。

考虑随着天数的增加,会新增一条从对应点到汇点的边。不难发现,新增边后,原来的源汇边均不会退流,仅有每天之间的边会退流。考虑费用流的过程:每次找到价值最大的没用的蔬菜,使得通路存在。于是我们不妨用线段树,第 \(i\) 个点维护 \((i,i+1)\) 之间反向边流量,即可快速实现修改流量和查询是否流通。每次枚举每一天及蔬菜种类,找最大的一个流即可。复杂度大概是 \(O(p^2nm\log p)\)

注意到你每次枚举每一天的蔬菜太慢啦。首先是基于费用流的过程,相等代价下流任意一条路都正确,而显然天数越靠后的越容易有通路,因此我们只需要每次 check 变质时间最靠后的一个未售出蔬菜即可,复杂度来到 \(O(nmp\log p)\)

此外,价值显然仅与蔬菜种类有关(唯一价值高一点的蔬菜最靠后,所以不冲突)。因此可以直接用堆维护每一种蔬菜的价格,取出最大的来 check。若这一种蔬菜此时已经没有通路了,则之后由于不会再有往前流的路,故不会再有存在通路的时候,直接不再考虑此种蔬菜,从堆中去掉;否则就会占用一个流量,使得 \(m\) 变小,我们再把下一个蔬菜扔进堆里去即可。这样堆和线段树的操作次数是 \(O(pm+n)\),总复杂度 \(O((pm+n)\log p)\),即可通过。

此题为什么做法和直接用堆维护反悔不同?因为此题所有的反向边都已经建好,并在初始时就有可能使用到,因此反向边的影响是全局的,不易用堆维护,然而该题的退流只涉及中间边,故可以考虑直接维护,从流量角度考虑问题;一般的反悔贪心每多一天,会新出现一整套点,后面的点不影响前面的点的决策,故反悔只考虑前面的部分,可以用堆维护,但退流涉及到很多边,故从路径角度考虑问题

此题时光倒流后,也可以转为一次加一套点的形式,故也存在时光倒流后反悔贪心的做法。

  1. 全局-最小/最大任意流

P5470 [NOI2019] 序列

题解 P5470 - 洛谷专栏

此题的操作不具有退流边不再流上的性质,因此不能用增量模型。考虑全局模型,决策每一个流量的增广路形态。有一些神秘的优先级问题,我们希望能加自由流量的优先。

posted @ 2025-03-03 12:19  烟山嘉鸿  阅读(39)  评论(0)    收藏  举报