图的匹配与网络流技巧总结
1. 拆点
1.1 入点和出点
P2770 航空路线问题
题意:有一行 个点和 条无向边,从 出发从左往右经过一些点到达 ,再从右往左经过一些点到达 ,除了 其它点不能经过超过一次,求最多经过多少点。
思路:相当于找两条不相交路径到达 ,拆点,用最大流来模拟途径城市,费用来计算经过个数,将一个点拆成 和 ,连 ,容量为 ,费用为 ,对于一条边 对应 ,因为一条边可能经过两次。这样就成了最大费用最大流,要求最大流必须是 。
1.2 按照时间拆点
这个非常常见,对于某些与时间有关,比如每次只有一个这类的限制,我们可以用这种技巧。
POJ3057 Evacuation
题意:一张 的地图,每个格子初始有一个人,边界上有若干个门。地震发生,每个人一秒移动一个格子,一个格子一秒可以有多个人,但是每扇门同时只能有一个人,所有人必须从门出去。求最少时间。
思路:对于每个出口,我们拆成不同时间的出口,这样就可以转化成求最大匹配了。
1.3 按照状态拆点
Magic portion gym-101981I
题意:有 个英雄和 个怪物,第 个英雄可以打败 中的怪物,但是每个英雄只能击杀其中的一个。现在有 个药水,一个英雄最多喝一次药水,如果喝了,可以多击杀一个能力范围内的怪物。求最多击杀多少只怪物。
思路:巧妙。网络流随便做,但是这道题可以用二分图最大匹配做。将一个英雄拆点成不喝药水和喝药水,然后连同样的边,为了保证至多 瓶药水,我们可以建立 个虚拟怪物,可以和任何一个喝药水的英雄连边,这样我们可以发现一定会有恰好 个喝药水的骑士去打虚拟怪物,这样我们用最大匹配减去 就是答案。
2. 棋盘
棋盘问题在网络流中很常见。
2.1 棋盘上的匹配
SGU190 Dominoes
题意:一个网格图,一些点有障碍,求一种方案,用多米诺骨牌覆盖所有没有障碍的点。
思路:棋盘是二分图,直接求匹配即可。
P3355 骑士共存问题
题意:给定一个棋盘,求最多能放多少个不会互相攻击的骑士。
思路:将棋盘黑白染色,显然是二分图,于是求最大独立集,用总点数减去最大匹配即可。
P5030 长脖子鹿放置
题意:一个长脖子鹿的攻击位置是 和 ,求最多放多少个互不攻击的。
思路:按照行的奇偶性来染色,求最大独立集。
2.2 棋盘模型
要点:行向列连边。
P7368 [USACO05NOV] Asteroids G
题意:贝茜想在 的网格中驾驶她的宇宙飞船。网格中有 个小行星。贝茜有一个武器,可以以一个单位代价消除一行或一列的全部小行星。贝茜想问你,要把所有小行星都消除的最小代价是多少。
思路:建出棋盘模型,本质上就是求最小点覆盖,根据 Konig 定理,最小点覆盖就是最大匹配,然后求最大匹配即可。
P1129 [ZJOI2007] 矩阵游戏
题意:一个黑白染色的方阵,每次可以交换一列或一行,求能否使得对角线全是黑。
思路:对于黑点建立棋盘模型,一次操作相当于交换两个点,显然如果有最大匹配通过交换任意两个点可以使得满足要求,所以就是最大匹配是否等于点数即可。
CF1198E Rectangle Painting 2
题意: 有一个 的网格,网格中有一些点是黑的,其他点都是白的。你每次可以花费 的代价把一个 的矩形区域变白。求把所有黑格变白的最小代价。
思路: 首先观察不难发现,每次取一行或一列肯定是最好的。
棋盘模型转化后就成了最小点覆盖,但是这题需要离散化,变成最小权点覆盖,用网络流求解即可。
3. 博弈相关
3.1 Undirected Vertex Geograph Game(UVG Game)
问题: 一张无向图上初始在 上有一个棋子,先手后手轮流移动,每次沿着边移动一步,不能移动到之前到过的节点,如果不能移动就输了。
结论: 当这张图的所有最大匹配都包括 时,先手必胜,否则后手必胜。
证明:
如果都包括 ,则我们每次都沿着匹配边移动,这就需要每次无论后手如何移动都会移动到匹配点上,但如果存在为匹配点,那么我们通过交错边就能得到不含 的最大匹配,这就矛盾了。
如果存在不包括 的,后手就按照匹配边一定,与前面类似,由于不存在增广路,所以后手永远有路。
3.2 相关例题
P1971 [NOI2011] 兔兔与蛋蛋游戏
题意:太长了看链接吧。
思路:
好题。首先需要几个观察。
观察一: 对棋盘黑板染色后,与初始空格同色的白子以及不同色的黑子永远不会被移动。
观察二: 每个棋子至多移动一次。
这两个观察比较显然,但是不好想到。
于是我们尝试建出二分图,对于可以移动的点向四个方向连边,现在问题变成从空格的那个点开始,轮流移动,不能移动到到过的点,不能移动就输了。对于答案,我们判断兔兔是否从一个必胜点移到另一个必胜点,如果是,则这一步错误。
发现这就是 UVG,于是直接跑匈牙利算法求匹配,然后每次取消一条匹配,dfs 找增广路,没找到说明这个点是必胜点。
然后就做完了,时间复杂度 。
4. 寻找最小/大化信息
P2764 最小路径覆盖问题
题意:给一个 DAG,求一个点不相交的路径覆盖,要求路径尽可能少。
思路:经典。我们思考路径尽可能少意味着有前驱节点的点数尽可能多,而每个点至多是一个结点的前驱,一个点至多有一个前驱,所以我们可以考虑匹配。
我们考虑建图,将一个点 的出点拆成 ,如入点拆成 ,一条边 等价于连一条 到 的边。显然这是个二分图,最大匹配就是最多的有前驱的节点,所以答案就是总点数减去最大匹配。
【无题号】有根
题意:有一个有向图 ,构造一个有根树森林 ,满足:
-
如果 是 的父亲,则 。
-
如果 和 再同一 SCC 中,则其不能为父子或兄弟。
求 中树个数最少是多少。
思路:关键在于转化最小化的信息。
显然我们希望最大化有父亲的节点,同一 SCC 中不能为父亲或兄弟预示着其父亲互不相同,所以我们考虑枚举每个 SCC,建二分图,左边是其他点,右边是 SCC 中的点,我们为其匹配父亲,如果 中有左边到右边的边就连,这样我们求出最大匹配就是有父亲节点个数的最大值。就做完了。
CF1404E Bricks
题意:你有一个 ()的格子纸,格子要么涂黑要么涂白。你需要用若干个长为一,宽为任意正整数或者宽为一,长为任意正整数的长方形去覆盖所有黑色格子,要求不能盖到白色格子上,不能盖到其他长方形上,不能盖出格子纸的边界,求最少用多少个长方形。
思路:转化最小化的信息。
我们希望最小化长方形个数,就是最大化每一条分界线在长方形内部的个数,我们不妨将相邻的两个点连边,我们希望尽可能多选这样的边。
但是我们要求一个点如果选了上下的就不能选左右的,于是我们将上下的和左右的分开,不能同时选的连边,建出二分图,求最大独立集,等于总点数减去最小点覆盖,也就是最大匹配即可。
5. 判定性问题
P3731 [HAOI2017] 新型城市化
题意:给一张无向图的补图,补图是二分图,现在可以增加原图一条边,使得最大团大小变大,求可以增加哪些边。
思路:原图的最大团相当于补图的最大独立集,进而转化为最大匹配,于是我们要求的就是哪些边一定在最大匹配中。
可以直接枚举在跑最大匹配,但是 ,我们考虑优化。
有结论: 这条边一定在最大匹配中当且仅当其在某个最大匹配且这个最大匹配的残余网络中 和 不在同一个 SCC 中。
于是我们用 Tarjan + Dinic 即可解决这个问题了。
6. 相关练习题
CF1054F Electric Scheme
题意: 有若干条平行于坐标轴的线段在平面上形成了 个交点,给你这些交点,求原来最少有几条线段,并构造出方案。
思路: 与 Bricks 类似,单独考虑一列的所有点,不难发现最终的答案应该是连续若干个点组成一个线段,我们希望线段少,就是希望相邻两个点在一个线段里的经可能多,所以我们找出所有相邻两个点的线段,但是我们要求除了给定交点不能有其他交点,直接枚举横向和纵向的,相交不在顶点处就不能同时选。
于是转化成最大独立集,从而我们要求最小点覆盖的补集,用网络流来做,可以更轻松的构造方案。
[ABC317G] Rearranging
题意:有一个 行 列的矩阵,其中 各出现了恰好 次,你可以进行任意次操作,每次操作可以把一行任意重排,最后要使得矩阵每一列都是一个长度为 的排列。
思路:对于每一列我们要求一个匹配,而总共有 列,从 推广开,不妨考虑建二分图,连 ,则这是一个 阶图,我们需要将其拆解为 个完美匹配,根据 Hall 定理相关知识,一定存在解,所以我们可以直接一次找一个匹配,然后删去即可。时间复杂度 。
[ARC080F] Prime Flip
题意:有无限枚硬币,其中有 枚硬币 初始时正面朝上,其余均为背面朝上,每次可以选择一段区间 ,将区间内所有硬币翻转,其中 为一个奇数质数;问最少多少次能将所有硬币全部翻为背面朝上。
思路: 经典套路。
显然异或差分,得到初始差分数组,首先差分数组应该恰好有偶数个位置是 ,这可以讨论连续段得出结论。
然后我们分成偶数和奇数,我们希望两两匹配消去。
首先,对于偶数配奇数,如果差的是质数,只需要一次操作即可消去。
对于偶数配偶数和奇数配奇数,差是偶数,根据哥德巴赫猜想(很神奇吧),可以用两个质数凑出,对于比较小的 也有方案。
最后就是差了一个奇合数,依然是哥德巴赫猜想的奇数形式,用 3 个质数凑出。
所以我们优先求偶数与奇数的匹配,再者就是自己内部配,最后如果还有剩的就加上 即可。
CF1070I Privatization of Roads in Berland
题意: 给一个 个点 条边的无向图和一个参数 ,现在需要对图上的所有边染色,满足:
- 所有颜色为 至 间的整数;
- 同种颜色的边最多两条;
- 每个点周围所有边的不同颜色数 。
构造方案。
思路:
好题。不妨考虑一个点度数是 ,同色邻边数是 ,则我们要求 ,也就是 。
观察发现同色边最好是公共点,否则没有意义。
不妨考虑重新思考这个问题:假设有若干资源,每条边可以为两边的点之一提供一个资源,每个点有一个最少资源数,构造一种方案。
建立二分图,左边是点和需求,右边是边,跑一个最大流就可以求出来。不满流直接无解,否则构造方案即可。
POJ2594 Treasure Exploration
题意:路径覆盖,允许点相交。
思路:和上道题类似,但是这道题不要求点不相交,可以先求出闭包,然后再在闭包上跑上一个题。
POJ3216 Repairing Company
题意:路径覆盖,允许相交,边带权,一条路径长度有限制。
思路:依然是路径覆盖,求出最短路,如果最短路时间够就连边,然后跑最大匹配。
HDU1853 Cyclic Tour
题意: 一个有向图,拆分成若干个环,没有自环,边带权,要求环的权值和最小。
思路:同样还是拆点,无解说明不存在最大匹配,否则就是求一个权值最小的匹配,直接上 就行了。
P2055 [ZJOI2009] 假期的宿舍
题意:有 个人,三种状态:是否是本校人员,如果是,是否假期离校。如果 认识 则 可以睡 的床。现在要求所有外校人员和本校留校人员每人按照上述要求分一张床,求是否可行。
思路:与路径覆盖类似,左部点是所有外校人员和住校人员,右部点是住校人员和不住校人员,然后认识就连边,求是否是完美匹配。由于住校人员会自己和自己连边,所以肯定会全部匹配,这样就保证最大匹配对应一组解。
[ABC263G] Erasing Prime Pairs
题意:有 种整数 ,第 种有 个。进行若干次操作,每次在这些数中取出两个,若它们的和为质数,分数加一,操作后把这两个数移去,求最大分数。
思路:显然除了 可以和自己配其它都是奇数和偶数。
我们建出二分图求最大流即可解决 。否则,我们先考虑 不和自己配,使得最后所有数最多配几对,然后剩下的 经可能多。
不难发现我们优先希望 和别人配,没办法了再和自己配,因为自己配一次消耗两个。满足上面条件再使得剩下的 尽可能多。所以我们考虑最小费用最大流,选一个 要 费用,则我们就可以求出再 不和自己配的情况下总对数最大,且剩下的 最多的情况。
[ABC205F] Grid and Tokens
题意:一个网格图,第 枚棋子可以放的位置是一个矩形,每颗棋子可以放或不放,要求每一行和每一列最多一枚棋子,求最多能放几颗。
思路:棋盘模型加拆点。先建出棋盘模型,对于一个矩形,我们连:,,然后 即可。拆点限制流量。
P4174 [NOI2006] 最大获利
题意: 选若干物品,选 有 的代价, 个奖励,同时选 和 收获 ,求最大获利。
思路
转化成二分图最大权闭合子图很好做,但是 ,不够优秀。
我们考虑我们要求最大化 ,即最小化其相反数。
我们将其利用整体减空白变成最小割的形式就有:。
其中 是 的邻边权值和。这个等式很容易证明。
所以我们将其转化成了集合划分的模型,建模 。
但是流量可能为负数,所以我们给所有 和 的边全部加上 ,最后减去 即可。
这样就是优秀的 了。
[ABC332G] Not Too Many Balls
题意: 有一些颜色为 的球,其中颜色为 的球有 个。此外,有 个盒子,第 个盒子能装 个球。
另外,对于所有的 ,满足第 个盒子最多装 个颜色为 的球。求这 个盒子最多能装多少个球。
思路
首先这道题是一道最基本的最大流。
按照题目说的建二分图然后连边,求最大流。
但是显然复杂度不行,我们要优化。
然后就是神奇的一幕:由于最大流等价于最小割,我们考虑求最小割。
画一画图发现相当与找两个集合 ,使得 最小。
考虑到后面的式子是二元的不好算,注意到 很小,所以我们不妨设 ,枚举这个 ,你们我们要求的就是下面的式子最小:
可以转化为:
前面相当于体积为 ,价值为 的 01 背包,后面直接差分加前缀和随便与处理一下就完事儿了。时间复杂度 。
P4249 [WC2007] 剪刀石头布
题意: 给一个只定了一部分向的完全图定向,要求三元环经可能多。
思路
最重要的是转化计数,我们统计不构成三元环的个数,刚好是 。
现在相当于给每一个点分配资源,要求总的这个值最小。
考虑到这个是一个凸函数,即二阶大于为 0,所以我们可以将其连向汇点的边拆成若干条,费用为相邻函数值的差分,这样就刚好可以计算这个值。
利用差分配合费用流很常见,重点是二阶导大于 0。
CF1630F Making It Bipartite
题意: 个互不相同的数,如果是倍数关系就有一条无向边,求最多保留几个点使得整张图是二分图。
思路
神题。我们观察倍数关系本质上是一个偏序关系,所以我们不妨给边定向。
然后我们发现,如果存在 ,那么一定存在 ,这就意味着存在奇环,显然是不行的。
所以我们便要求不存在长度超过 1 的路径,也就是说,我们能将图分成两个点集 , 只向 连边,内部都没有边,显然这是一个二分图。
我们考虑一个点有三种选择,要么不选,要么是 ,要么是 ,所以我们考虑对于原图 ,复制一份得到 ,并连 的边。
首先会发现整个图依然是一个偏序集,并不影响。
这样考虑这个图的一个最大反链,会发现对于一个点只会选其中的一个,如果选 中的那个,说明没有出边,反之同理,可以对应到一个方案上。
所以我们就是求这个偏序集的最大反链,用 Dilworth 定理可以做到求最小链覆盖即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】