网络流与二分图

基础概念

  • 残量网络:删去流量已经满了的边得到的图。
  • 增广路:在残量网络中从源点 \(S\) 到汇点 \(T\) 的一条路径。
  • 独立集:图上两两不相邻的点构成的集合。

网络最大流

由于网络流的反悔性质,所以最大流可以动态加边,而费用流不可以。

EK

每次寻找最长度短的一条增广路,时间复杂度 \(O(m^2n)\)

Dinic

分层图,多路并进,时间复杂度 \(O(n^2m)\)
在二分图匹配/单位流量图中的复杂度为 \(O(m\sqrt n)\)

ISAP

时间复杂度 \(O(n^2m)\)

SSP

要求无负环,基于 EK 的最小费用最大流的时间复杂度为 \(O(mnf)\)。其中 \(f\) 为最大流量。

无源汇上下界可行流

设每条边的上下界为 \([b_i,c_i]\)

先建立超级源点和超级汇点。我们先让所有边都流满下界,然后求出每个点净流量 \(w_i=\sum f(u,i)-\sum f(i,u)\)。由于充满下界之后,这一部分消耗在后续无法体现了,所以对于 \(w_i>0\) 的流量没了,我们就要补。对于 \(w_i<0\) 的流量如果不统计就是后面多了,所以要流出。

如果 \(w_i>0\),那么我们就从源点向该点连一条流量为 \(w_i\) 的边。如果 \(w_i<0\),我们就从该点向汇点连一条 \(-w_i\) 的边。同时每条边的流量都减去下界。如果此时的最大流等于 \(\sum\limits_{w_i>0}w_i\),那么说明可以。

gym103855 I

合并的过程就是每个点往上连的过程,上下界为 \([0,\infty]\)。如果一个袋子被观察范围是 \([l,r]\),再被合并的时候上下界就是 \([l,r]\),如果一个丢弃就在目前袋子向该原始点连一个 \([0,1]\) 的边。最后所有点都向原始点连边。

图论建模

我们要用一种流/割将方案唯一对应。

P1402 酒店之王

把人放在中间拆成两个点中间流量为 \(1\) ,然后两边分别是食物和房间,往两边连边即可。

P4003 无限之环

费用流神仙题,首先为了让所有方格都流满,我们可以对于图奇偶染色,然后分别连源点和汇点。

对于转动次数要求,我们可以把一个点拆成五个点,中间一个点,然后周围四个点,中间点要去连源点/汇点,并且朝着有管道方向分别连流量为 \(1\),费用为 \(0\) 的边。然后当我们旋转的时候,有一条连接上右的边的顺时针旋转 \(90°\) 后会连向下右,于是我们直接从上节点到下节点连一条费用为 \(1\) 的边即可。逆时针同理,左右节点连边。那么如果是旋转 \(180°\) 呢?我们发现已经不需要再连了,只要我们同时选择上下和左右就等价于完成了 \(180°\) 旋转。其他情况也是类似。

最小割

网络中,最大流=最小割

在图上的意义就是让图上的 \(s\)\(t\) 不联通的最小代价。一般常用于集合划分(划分对应不连通)的题目。

P4897 【模板】最小割树(Gomory-Hu Tree)

\(solve(l,r)\) 表示对于 \([l,r]\) 之间的点建立最小割树。每次对于 \(a_l\)\(a_r\) 跑一遍最小割,然后依据最后一次 bfs 的连通性划分左右点集即可。

建完树后,两点之间的最小割就是树上两点路径之间的边权最小值

P2057 [SHOI2007] 善意的投票

从拆点角度不好考虑同伴之间的贡献。

集合划分思想。如果支持就与 \(S\) 连边,反对就与 \(T\) 连边。割掉一条 \((S,i)\) 表示由支持到了反对,同时朋友之间连边,如果意见不一就割掉他们之间的连边,注意是要建双向边,无论哪一方意见改变都要割开。

思考一下 \(s,t\) 不联通的条件,要么断掉中间的边表示一方 \(s\),一方 \(t\),要么断开和 \(s/t\) 的边,表示归顺于另一方。正好符合题目要求。

CF1082G Petya and Graph

数据范围小的匹配/选择类问题考虑网络流。匹配类的套路就是把不同类的放两边跑网络流,这题就是直接把边和点各放一边跑最小割,下面是说明。

我们可以先把边权都加上也就是 \(\sum w_i\),然后就是选点了,我们每选一个点会使得答案减少 \(a_i\),如果一条边的两个端点没有被同时选同样会使得答案减少 \(w_i\)

考虑最小割,我们从源点 \(s\) 向每条边连一条 \(w_i\) 的边,从每条边向两个端点各连一条 \(w_i\) 的边,同时每个点向 \(t\) 连一条 \(a_i\) 的边。每个点和 \(s\) 联通代表被选,和 \(t\) 联通代表没有被选择了。如果要选某点就要隔开和 \(t\) 的边使得其和 \(s\) 连通,也就要付出 \(a_i\) 的代价割开和 \(t\) 的边。如果两点其一和 \(t\) 联通就要用 \(w_i\) 的代价和 \(s\) 断开,完美符合题目要求。

P4174 [NOI2006] 最大获利

同上双倍经验。

CF1383F Special Edges

考虑最小割,设初始所有特殊边都是可以无代价割的。

现在思考一下如何对于每组给出的 \(w_i\) 的意义,就是改变了这些边割开的代价。从原来的无代价变为需要 \(w_i\) 才能割开。

如果对于每一组 \(w\) 都跑一遍网络流,发现最后的情况一定是某些特殊边被割了,某些特殊边没有被割。考虑特殊边带来的权值,假设被割的边集为 \(S\),我们就要付出 \(\sum\limits_{i\in S}w_i\) 的代价。

由于特殊边的个数很少,我们可以提前枚举所有边被钦定割和不割的情况,然后将可割的边设为 \(0\),不可割的边设为 \(\infty\),最后只需要在每次查询的时候补上 \(\sum\limits_{i\in S}w_i\) 即可。

于是就有了以下做法。

通过设置 \(\infty\)\(0\) 来表示可否割。我们枚举 \(2^k\) 种所有状态,算出此时的最小割,为了快速计算可在上一次的基础上进行计算,根据网络最大流可以动态加边得知这是合法的。初始状态可以用 Dinic 来做,然后发现边权上界很小,于是每次扩展就用 FF 来做。

查询时,也是枚举 \(2^k\) 种状态,对于可割的边累加上 \(\sum\limits_{i\in S}w_i\) 即可。时间复杂度 \(O(2^kw m+q2^k)\)

然后是这个设置 \(\infty\) 的问题,我们可以将 \(\infty\) 设为 \(25\)。虽然对于一般的网络流将 \(infty\) 设为 \(\max w\) 是不合法的,但是本题其实是可以的。如果我们在某一种方案中,选择割开了钦定不能选的边权为 \(25\) 的边,那么这种方案必定不如钦定这条边能选的方案,因为 \(w_i\le 25\),钦定它能选带来的代价小于选择割开它的代价。

ARC125E Snack

建立二分图之后跑最大流是显然的,\((S,i,a_i)\)\((i,id_j,b_{id_j})\)\((id_j,T,c_{id_j})\),但是复杂度太高了。

考虑最大流转最小割,可以发现能割的地方有三处,仔细观察统一性之后可以枚举左边切了 \(k\) 条边,右边就是 \(\sum \min(c_i,(n-k)\times b_i)\),其中这个 \(k\) 值不影响右边的代价, 所以我们直接选择最小的 \(k\) 条边切掉就行了。

最大流

Gym102201J Jealous Teachers

给出一张二分图,左边 \(n-1\) 个点 \(P_i\),右边 \(n\) 个点 \(Q_i\),按照以下规则连边。
其中第三类边会在题中给出,问最大流能否达到 \(n(n-1)\)
同时需要给出中间流量的方案。满足 \(n\le10^5,m\le 2\times 10^5\)

  • \((S,P_i,n)\)
  • \((Q_i,t,n-1)\)
  • \((P_i,Q_j,\infty)\)

直接跑最大流复杂度显然不对,应该是一个二分图匹配状物。于是先随便找一组左右 \(n-1\) 个点的匹配,然后每个点流满 \(n-1\) 的流量。然后后面的步骤和上一题好像。

此时左边每个点还多了 \(1\) 的流量,右边还有一个没匹配上的点剩余 \(n-1\) 的流量,我们要做的就是把左边 \(n-1\) 个点的流量流到右边点上去,考虑增广路,从右边点开始 dfs,可以经过左右的点,如果能达到左边的所有点就成功了。

QOJ6508. CCPCF22H This is not an Abnormal Team!

给定一个二分图,你要把图分为大小为 \(1\)\(2\)\(3\) 的连通块,使得:大小为 \(1\) 的联通块数量尽量少,在此基础上大小为 \(3\) 的联通块数量尽量少。
其中数据满足 \(n\le 10^5,m\le 2\times 10^5\)

如果只分为大小为 \(1\)\(2\) 的,那就是最大匹配了。

可以发现 \(3\) 的作用是把 \(1\)\(2\) 拼接起来,来消耗 \(1\)

于是我们先跑一遍最大匹配,可以发现一个联通块内要么所有未匹配点都在左侧,要么都在右侧,否则出现增广路。

假设未匹配点都在左侧,那么这又是一个匹配的过程了,我们要将左侧的 \(1\) 块,和横跨左右的 \(2\) 块匹配起来,不妨以这个 \(2\) 块的右侧点为基准。

于是对于 \(1\) 块的点连边 \((S,u,1)\),对于 \(2\) 块的点 \((l_u,r_u)\),连边 \((r_u,T,1)\),然后用 \(u\to r_v\) 的边(也就是左 \(1\) 到右 \(2\) 的连边)和 \(r_v\to l_v\) 的反悔边跑最大匹配即可。一定别忘记设置那个反悔边了!

两次都是单位边权的网络流,时间复杂度 \(O(m\sqrt n)\)

费用流

P4249 [WC2007] 剪刀石头布

可以模拟退火。这里采用费用流。

直接考虑三元环难以刻画,可以用总数减去不形成三元环的三个点个数。通过对于入度数的研究可以发现竞赛图三元环个数是 \({n\choose 3}-\sum\limits_v{deg_v\choose 2}\)。可以直接用费用流解决,最大流限制一下每条边必须定向,费用就是 \(\Delta{deg_v\choose 2}=deg_v-1\)。我们从源点向每条未定向的边连一条流量为 \(1\),费用为 \(0\) 的边,代表最多选择一个方向。把图中每个点进行拆点拆成不同费用的点。每条边向其连接的两点连若干条流量为 \(1\),各种费用的边即可。

P4003 无限之环

费用流神仙题,首先为了让所有方格都流满,我们可以对于图奇偶染色,然后分别连源点和汇点,这步操作保证了相邻格子之间的流有动力进行。

对于转动次数要求,我们可以把一个点拆成五个点,中间一个点,然后周围四个点,中间点要去连源点/汇点,并且朝着有管道方向分别连流量为 \(1\),费用为 \(0\) 的边。然后当我们旋转的时候,有一条连接上右的边的顺时针旋转 \(90°\) 后会连向下右,于是我们直接从上节点到下节点连一条费用为 \(1\) 的边即可。逆时针同理,左右节点连边。那么如果是旋转 \(180°\) 呢?我们发现已经不需要再连了,只要我们同时选择上下和左右就等价于完成了 \(180°\) 旋转。其他情况也是类似。

相邻格子之间也要连边,比如说 \((i,j)\) 的左要和 \((i,j-1)\) 的右相连。如果最后检查流满了,那么答案就是费用,否则就是 \(-1\)

AGC031E Snuke the Phantom Thief

至多选择不太好刻画,枚举选择点的个数,于是假设我们选了 \(k\) 个点,对于点的横坐标排序后为 \(x_1,x_2...x_k\)。那么至多选择 \(t_i\) 个横坐标小于等于 \(a_i\) 的限制就可以转化为 \(x_{t_i+1}>a_i\),对于其他几类约束同理,我们可以得到每一个数的某个坐标在一个区间里面。

然后这个时候可以忽略单调性。这是一个类似匹配的问题,将一个约束要求 \(x_{t_i+1}>a_i\),转化为 \(X_{t_i+1}=a_i\),然后我们要把 \(x_i\)\(X\) 匹配起来。对于 \(Y\) 也要有约束,双约束要考虑建立三个区域点的图,我们可以把左边设置为 \(X_{1},X_2...X_k\),中间为每个点 \((x_i,y_i)\),右边为 \(Y_1,Y_2,...Y_k\),能连边只有在点的坐标范围满足上述区间约束。跑一遍最小费用最大流即可,其中最大流保证了选出了恰好 \(k\) 个点。

二分图

一张图为二分图,当且仅当图无奇环。

二分图染色

这也是判定二分图的方式之一。

AT2016D マス目と整数

染色不止有 \(0/1\) 染色,扩展至更大域也是可以解决的。

二分图最大匹配

0要素 每个集合内部有0条边

1要素 每个节点只能和一条匹配边相连

二分图最小点覆盖

2要素 每条边两个端点,二者至少选一个

常见应用:完成一个任务有两种方式,两者选其一即可。

QOJ10045.Permutation Recovery

有一个暴力的方法是枚举所有排列,对于当前排列找到其逆排列,尽可能从剩余可重集中选出这个逆排列。瓶颈在于我们不知道哪些排列是可取的。

既然全局取整个排列不可做,我们就从局部,每次取出两个位置上的正逆排列的每个位置连边,\(i\to j\)\(j\to i\)。问题是我们怎么找到一个排列,直接从置换环角度考虑的话是若干个环套在一起很难做。考虑把排列看成一个值和下标的匹配,把每个点拆成 \(\rm in\)\(\rm out\)。这样子就是一个二分图了,直接跑 \(k\) 次二分图完美匹配就行了。

Hall定理

二分图 \(G\) 的左部点点集为 \(X\),右部点点集为 \(Y\),设 \(\lvert X \rvert \le \lvert Y \rvert\),则二分图 \(G\) 存在完美匹配,即匹配个数为 \(\lvert X \rvert\)。 当且仅当,对于 \(X\) 的任一子集 \(X'\),满足 \(\lvert X'\rvert \le \lvert Nb(X')\rvert\)\(Nb(X')\)\(X'\) 的邻居点集。

ARC076F Exhausted?

显然的一个二分图匹配模型,但是我们不能把图建出来因为复杂度太高了。但是我们发现每个点连的点集是有特点的所以考虑使用 Hall 定理。Hall 定理的推论是二分图的最大匹配数是 \(\lvert X \rvert-\max(\lvert X'\rvert-\lvert Nb'\rvert)\)。转化一下问题就是我们只需要找到一个集合 \(S\),最大化 \(\lvert S\rvert-(m-\bigcap_{i \in S}(l_i,r_i))\)。扫描线维护即可。

P11225 [COTS 2019] 疏散 Sklonište

考虑二分答案之后转化为判定。

对于匹配类问题很容易想到二分图。本题的建模是显然的,对于判断有无解可以使用 Hall 定理。对于左边的集合不太好处理,可以枚举右边的集合 \(T\),然后找到一个最大的集合 \(S\) 满足 \(Nb(S)=T\),只需要判断 \(\lvert S\rvert\)\(\sum\limits_{i\in S} cnt_i\) 的大小关系即可。

对于左部每个点处理出邻居节点,然后做一遍高维前缀和即可。

ZROI.2845 蓝花楹

很牛逼的题目。

不要从整体的大角度来思考,考虑一些局部的东西。

\(n\) 个点图的生成树可以有 \(n-1\) 条边,可以思考为匹配类问题。

类似于二分图,左边为颜色右边为点集。

每个颜色向其所覆盖的点连边,不过最后不是要求一组匹配,而是 “类匹配”,因为连出来的 \(t\) 个点只能提供 \(t-1\) 个匹配点。不过也足以我们使用 类 Hall 定理来判断,枚举所有颜色集合 \(S\),设覆盖了 \(t\) 个点(也就是可以用 \(t-1\) 条边),那么只要 \(\lvert S\rvert \le t-1\) 即可,对于所有集合满足上述要求就判断成功了。不过可能会有一种颜色涉及到了很多点不好判断,这里有一个观察就是如果一种颜色覆盖的点的个数 \(\ge {k\choose 2}\),那么这种颜色就直接合法了,因为此时无论其他边怎么连,他都能找到自己的一种连法,把这种颜色直接跳过,判断集合中的其他颜色即可。时间复杂度 \(O(q2^kk^2)\)

考虑从二分图的另一种判定增广路来解决这个问题。

依次枚举所有颜色,维护当前生成树,首先还是上述判定如果边数 \(\ge {k\choose 2}\) 就跳过。然后枚举该颜色所有的边,尝试加入边,如果并查集判断不成环就直接加入,该颜色合法,继续枚举下一个颜色。如果发现加入之后成环了,那就尝试提取这条树链,看看树链上每条边对应的颜色是否可以加边,如果可以加边意味着可以把该颜色的这条边加上,把另外一条本来被加入的边删去,这样子加入当前枚举颜色的边的时候就不会成环了。同时对于每一种枚举颜色,其他颜色在本次计算中最多只能被增广一次,因为如果增广成功就可以让本次枚举颜色合法,如果增广失败意味着以后增广也是失败的,于是直接开一个 vis 数组记录一下即可。

时间复杂度 \(O(qk^3)\)

AGC029F Construction of a tree

生成树可行性问题考虑用二分图的类 Hall 定理来匹配点和边。

左边点代表点集,右边点代表给出的点,每个左边的点集向它所包含的所有右边点连边。

如果对于任意一个左部点的集合 \(S\),如果右边连向的点个数 \(< \lvert S\rvert+1\) 就代表 右边的点无法提供 \(\lvert S\rvert\) 个匹配位点,那就无法成功,否则如果对于所有左部点的集合都判定成功就可以连出树。注意 \(n\) 个点只能提供 \(n-1\) 个位点。

我们先做一个二分图的匹配,然后可以找到 \(n-1\) 个点集对应 \(n-1\) 的点。如果找不到自然是无解了。然后必然有一个节点没有被匹配到,于是我们考虑从这个点开始 dfs,遍历整张图(每一次从右到左再到右 \(u\to S_i\to v\),都代表在树上用 \(S_i\) 集合内的点对连接了 \((u,v)\) 边),如果经过所有左边的点,那么就说明合法。如果在某个时刻无法扩展,说明对于当前已扩展集合,不满足点数 \(\ge \lvert S\rvert+1\),那就等于找到了一个不合法的左部点集合,就无解。否则能搜到所有点,那也就是等于找到了一种合法的方案。

最大独立集

CF1389F Bicolored Segments

显然的线段树优化 dp,但是注意有两种颜色的变化。我们不妨假设我们所选取的 dp 点均为两种颜色的断点,这个假设很重要,否则不太容易转移。于是我们需要对于扫描过的线段对颜色相反的线段树产生贡献。
两种颜色,容易想到二分图。对于不合法的点连边,于是就是一个最大独立集。于是答案就是 \(n-\) 最大匹配。直接建图不太好求解,这个时候就需要对于该二分图找规律。对于线段右端点排序,不难发现每个点连的边是一段区间,而且区间还是具有一定单调性的。所以一定是贪心地匹配最前面相交的点。

P9726 [EC Final 2022] Magic

很巧妙的题目啊。考虑两个区间的关系,分离的话贡献是独立的不需考虑,包含的话先执行大区间再执行小区间是更优的。现在考虑两个区间相交,

我们发现画红笔的两个地方最多只有一个产生贡献,然后有很多类似约束,于是我们可以建二分图跑最大独立集即可。

\(l_1,l_2..l_n,r_1,r_2..r_n\) 互不相同保证了图为二分图。

posted @ 2024-03-17 10:27  Mirasycle  阅读(58)  评论(0)    收藏  举报