网络流与二分图
基础概念
- 残量网络:删去流量已经满了的边得到的图。
- 增广路:在残量网络中从源点 \(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\) 的边。如果 \(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°\) 旋转。其他情况也是类似。
最小割
网络中,最大流=最小割。
P4897 【模板】最小割树(Gomory-Hu Tree)
\(solve(l,r)\) 表示对于 \([l,r]\) 之间的点建立最小割树。每次对于 \(a_l\) 和 \(a_r\) 跑一遍最小割,然后依据最后一次 bfs 的连通性划分左右点集即可。
建完树后,两点之间的最小割就是
P2057 [SHOI2007] 善意的投票
集合划分思想。如果支持就与 \(S\) 连边,反对就与 \(T\) 连边。割掉一条 \((S,i)\) 表示由支持到了反对,同时朋友之间连边,如果意见不一就割掉他们之间的连边,注意是要建双向边,无论哪一方意见改变都要割开。
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\) 来求答案,这里只考虑特殊边,发现最后的情况一定是某些边被割了,某些边没有被割。被割了的边中有在本次赋权的,也有可以无代价割的。最后要求的代价自然是要带上赋权了的新权值,可以发现这个赋权了的新权值可以最后再加上,于是我们只需要求出某些特殊边可以被无代价割和另一些特殊边不可被割时候的最小割,最后再加上那些被无代价割的边里在本轮被赋值的代价和即可。
考虑预处理所有状态以便快速计算答案。
我们可以考虑通过设置 \(\infty\) 和 \(0\) 来表示可否割。我们枚举 \(2^k\) 种所有状态,算出此时的最小割,为了快速计算可在上一次的基础上进行计算,根据网络最大流可以动态加边得知这是合法的。初始状态可以用 Dinic 来做,然后发现边权上界很小,于是每次扩展就用 FF 来做。问题就解决了,时间复杂度 \(O(2^k\omega m+q2^k)\)。
费用流
P4249 [WC2007] 剪刀石头布
可以模拟退火。这里采用费用流。
直接考虑三元环难以刻画,可以用总数减去不形成三元环的三个点个数。通过对于入度数的研究可以发现竞赛图三元环个数是 \({n\choose 3}-\sum\limits_v{deg_v\choose 2}\)。可以直接用费用流解决,最大流限制一下每条边必须定向,费用就是 \(\Delta{deg_v\choose 2}=deg_v-1\)。我们从源点向每条未定向的边连一条流量为 \(1\),费用为 \(0\) 的边,代表最多选择一个方向。把图中每个点进行拆点拆成不同费用的点。每条边向其连接的两点连若干条流量为 \(1\),各种费用的边即可。
二分图
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\) 的大小关系即可。
对于左部每个点处理出邻居节点,然后做一遍高维前缀和即可。
最大独立集
CF1389F Bicolored Segments
显然的线段树优化 dp,但是注意有两种颜色的变化。我们不妨假设我们所选取的 dp 点均为两种颜色的断点,这个假设很重要,否则不太容易转移。于是我们需要对于扫描过的线段对颜色相反的线段树产生贡献。
两种颜色,容易想到二分图。对于不合法的点连边,于是就是一个最大独立集。于是答案就是 \(n-\) 最大匹配。直接建图不太好求解,这个时候就需要对于该二分图找规律。对于线段右端点排序,不难发现每个点连的边是一段区间,而且区间还是具有一定单调性的。所以一定是贪心地匹配最前面相交的点。