网络流与图匹配
【学习笔记】网络流
(2024.4.23)
时代的眼泪,近几年真的有考过吗,感觉不如二分图。
Part1. 基本定义
- 流函数
满足 1.斜对称性 2.流量守恒。 - 定义残量网络为容量函数
的网络,当 视作不存在。 - 定义增广路
是残量网络上一条 的路径。 - 定义割为将
分成两个不相交集合 ,且 。定义割的 容量 为 ,流量为 。若 所属集合不同,则边 为割边。最小割即为将 容量 最小化的分割方案。
Part2. 最大流
定义一次 增广 操作为:找到残量网络上一条增广路,每一条边增加
实现上,++cnt
,并且正反边 紧邻 ,则 i^1
即为反向边。即正向边是偶数,反向边是下一个奇数。
EK 算法
即使用 bfs
寻找 长度最短 的增广路,此时复杂度为 dfs
方法。
Dinic 算法
核心思想是 分层图 以及 当前弧优化 。分层图的目的是规范增广路的形态,避免形成一个环。
增广路时流量等于容量的满边是无用的,可以直接跳过,为此记录每个点出发第一条没有流满的边,称为 当前弧 ,看似是常数优化实际上影响了复杂度:不加优化为
Part3. 无负环的费用流
相较于一般网络流,每条边加入一权值
连续最短路 SSP 算法
实现上,将 Dinic 的 BFS 换做 SPFA,且 DFS 多路增广时,仅在
理论时间复杂度为
注意 SPFA 在队首位 T 时不能直接 break;
,因为此时 d[T]
不一定是最短路。
Part4. 最大流最小割定理
感性理解就是 最小割一定是
【模板】最小割树(Gomory-Hu Tree)
次询问一个图, 两点间的最小割。
定理:不管怎么选两点,最小割只有
因此考虑分治,每次在原图上找两个点
结论:
然后对于多次询问,树上倍增处理即可。
但是,因为网络流的图都很小
Part5. 对网络流的理解
-
费用流与贪心
费用流的策略是找到长度短的增广路进行增广,并且在添加反边以支持返回。因此 费用流和反悔贪心可以相互转化,于是一些费用流题目,可以转换为贪心再方便地利用数据结构维护。
-
费用流与凸性
如果问题可以抽象成费用流模型,每一滴流量带来的贡献单调,则选取
个物品答案 有凸性,可以使用 wqs二分。 -
最小割求方案
可能会理解割边为最大流上流满的边,反例:
。正确的做法是,残量网络上
能到达的点为 ,否则为 。再判断割边。 -
反悔的性质
在解决 动态加边 的最大流问题时,不需要担心原来的流方案影响正确性,因为正确性基于反悔。
但对于费用流问题,正确性基于最短路,则加入新边后需要重新跑 SPFA。
Part6. 上下界网络流
即新增下界
1.无源汇可行流
可行性主要在于流量守恒,即每个点不能储存流量。
核心思想:先满足下界限制,在尝试调整 。具体地,先让每条边都流满下界
根据 斜对称性,则不妨设
这启发我们新建一个网络
这个地方特别容易记混,如果一个点入度大于出度,则应该由虚拟源点向其连边,因为这样才能让这个点多流出这些流量。
2. 有源汇可行流
从
细节:最后加这条边,则直接删 e[tot].w
即可。
3. 有源汇最大流
引理:对于任意一组可行流,对其运行最大流算法,总能得到最大流。
因此,得到一组可行流
4. 有源汇费用流
同样转换即可,初始为
Part7. 应用与模型
1. 最小割点----点边转化
将每个点拆为
2. 集合划分模型
有
建模:将
扩展
- 若
存在负值,则同时加上 ,最后结果减去 ,因为每个点只有选或不选两种状态,所以与最短路等模型不同,其不会影响答案。
3. 最大权闭合子图
或许是更系统的理解方式。
有向图 的闭合子图是指
考虑转换为集合划分模型,若一个点选,则
此时是最大割(NP-Hard)问题,转换成最小割,
当然有的
总结:原图建出来,每条边赋值
4. 有负环的费用流
运用上下界网络流将负权边强制满流即可,再建立
记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 。还是注意第一步最大流应该取 e[tot].w
的,并且要清空这条边的容量。
应用在哪?很多题的贪心可能是最大费用最大流之类的,取反后即为(可能)有负环的费用流。
Part8.(新)网络流二十四题
1. P1251 餐巾计划问题
每天需要
条干净毛巾,用完后的脏毛巾可以有两种送洗方案: 天后用,费用 , 天后用,费用 ,或者保存起来延期送洗。你同时可以选择买干净毛巾,价格 。
此题精髓在于对两种毛巾状态的拆点处理。
我们可以想到,每天开始的时候只有干净的餐巾可使用,每天结束的时候仅有脏的餐巾需要操作。于是将每天拆成两个点:起始点与结束点,分别处理不同时间段所需操作。
起始点连向汇点,源点连向结束点,表示每天固定要用
对于一个起始点,有源点连向他表示购买毛巾。
对于一个结束点,连向
Debug
费用流中,如果仅判断 dis,而不判断 dep
,应在开头判断是否为终点,否则在终点有边权为
2. P2764 最小路径覆盖问题
求一张有向无环图,所有点都覆盖一次,路径最少的个数。
要求点只通过一次是困难的,这启发我们点边互换,套路的,将一个点拆为
我们考虑调整法,初始状态是
3. P4043 [AHOI2014/JSOI2014] 支线剧情
给定一个 DAG,边有边权,有若干出度为
的点和一个入度为 的点 ,可以回退到根,求 到达所有叶子节点 的边权之和最小值。
相当于每条边下界为
Debug
容易搞混虚拟源点汇点连边的方向。
4. P1646 [国家集训队] happiness
在集合
价值为 ,在集合 价值为 ,若干个同时在 有价值 ,求最大价值。
集合划分问题模板,转换为最小割即可。
注意题目要求最大价值,且限制是两人在一个集合的额外价值。
用总答案减去最小割,转换为不选...的问题,对于相邻两个学生,则新建一个点
有若干倍经验均是此套路。
Debug
不是这太坑了,注意连边方向,别把虚拟点连成新的”源汇点“。评测记录 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
还有 id(x,y)=(x-1)*m+y
不要写成 n
呀。
flag:我就不信我今天还能连边方向出问题。
6. P5029 T'ill It's Over
初始有
个数 ,你有 次操作,每次操作可以将一个范围在 的数变成 的任意一个数,且这个操作有次数限制。 求最后最多有多少个数变成
。 注意操作不是在线的。值域
。
将值域抽象为点,则显然是网络最大流。
然后显然是线段树优化建图区间连区间,根据套路,两颗线段树,一颗向上连,一颗向下连,共用叶子。
还是线段树良心,一遍过了。记录详情 - 洛谷
7.CF1009G Allowed Letters
给你一个字符串
,字符集为 ,你可以任意排列。需要保证每个位置的字符集为 。问字典序最小是多少? 。
对于字典序问题都可以贪心,对于每个位置枚举当前填
具体的,二分图左部是每个位置,右部是六个字符。一个位置
检查完美匹配,我们通常可以想到两个方法:增广路和 Hall 定理。增广路的做法就是走状压 dp 的套路。两者都适用于
考虑 Hall 定理,左部大小为
8. P3980 [NOI2008] 志愿者招募
有
天,每天至少需要 个志愿者,有 种志愿者,每种个数不限,价格为 ,负责 的工作。求最少花费。
无论是单纯性还是上下界都比原做法好理解多了。
用上下界网络流,
10. P2050 [NOI2012] 美食节
个厨师 份菜, 做 号菜的时间是 。第 个顾客选择了 号菜品。最小化所有人的等待时间之和。
第
11.P3749 [六省联考 2017] 寿司餐厅
有
份寿司,你可以选择若干个不交极长段 ,一次选择的价值是 。同时,每个 有一个种类 ,表示如果有 个选择的是种类 ,就要付出 的负贡献,其中 是给定的。求最大价值。
发现如果选择
据此转换为最大权闭合子图问题即可。
12. P2805 [NOI2009] 植物大战僵尸
平面直角坐标系上有
个植物,击败有 的价值(可能为负数),第 个植物还有一个攻击到的点的集合 ,且伤害是秒杀。 你是僵王博士,僵尸从右侧进入,吃
前必须吃 。求最大可能的价值是多少。
两种保护关系形成一个有向图,
但是保护关系会 成环 ,而且任意能到达环上的点同时也不能选。用反图拓扑排序处理即可。
13. Pumping Stations
给定一个图,你需要构造一个排列,收益为
,使得收益最大。并求出方案。
最小割树模板题,考虑分治建出最小割树。最小割等于路径上最小值,则树上最小边是只经过一次的,再分治进行处理。
14. P4298 [CTSC2008] 祭祀
给定一个DAG,你需要选择若干个点,满足任意两个点不能互相到达。最多化点的个数。
求出点的个数,并输出方案。
实际就是求 最长反链 。
**Dilworth **定理指出:最长反链=最小“链”划分,注意这里的“链”不同于最小路径覆盖问题,而是指可交链。
那这个问题与 2. P2764 最小路径覆盖问题 的区别在于:链可以被“挖空”,只保留端点。
因此我们用 Floyd传递闭包 建出每个点能够到达的点,再在这张新图上做原问题最大流即可解决第一问。
容易发现,因为无环,用传递闭包所建出的图是二分图。
第二问要输出一个可行的方案,实际就是 二分图最大独立集 ,按照其输出方案的套路做即可:
从左侧未匹配的点出发 dfs,从左往右只走非匹配边 ,从右往左只走匹配边,最小点覆盖即为 左侧的未访问点+右侧的访问点。最大独立集即为: 左侧的访问点+右侧的未访问点。
第三问求:是否存在一个最大方案选择了点
因为传递闭包,
Part9. 其他习题
1. Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流
建立起点
Debug
第一步 dinic()
得到的最大流应该是 e[tot].w
,而非 dinic()
。
模拟费用流
二分图
竞赛幽灵,难在一些套路化的建模上。
如果两个贡献独立————贡献在坐标上————转换成二分图 。
Part2. 二分图神仙建模
1.给定
个点,点有横纵坐标,我们称 一对点是好的,当且仅当横坐标相同或纵坐标相同。 最大化好的配对的数量,要求每个点都在一个配对中。
套路:横坐标连纵坐标。
2.给定一张
网格图,有 个障碍。你一次可以跳到当前行或当前列任意一个没有障碍的点。求所有能跳到的点需要的跳跃次数的总和。 。
套路:每个障碍横坐标连纵坐标,转换成补图最短路。
给定一个
矩阵,每个点有 概率为 ,否则为 ,求矩阵积和式 的概率。 。 积和式即为不带系数的行列式:
。
如果一个点是
Summary
在矩阵/网格图 上,多思考二分图
Part3 二分图相关问题和定理
1. 最大匹配
若边集
特殊的,
2. 最小点覆盖集
给定二分图
构造方法:先求出一组最大匹配,从左侧未匹配的点出发 dfs,从左往右只走非匹配边 ,从右往左只走匹配边,最小点覆盖即为 左侧的未访问点+右侧的访问点。
3. 最大独立集
若点集
二分图最大独立集
4. 最大团
若 点导出子图
二分图最大团等于 补图最大独立集 。
平面图
定义
如果图能画在平面上,边之间两两无交(边不能画曲线),则称其为平面图。
判断:若两个图是同构的,或者两个图在不断增加或消去二度顶点后同构,则称两个图是同胚的。
库拉图斯基定理指出:图
平面图转对偶图
通俗的讲,对偶图是在平面图上每个封闭图形中放一个节点,节点之间边的·边权即为原图与这条边相交的边权。
例如下图为狼抓兔子一题中的平面图转对偶图。
原题答案为 14,即为切断右下角的三条边:3 6(不清楚) 5。
可以发现,平面图的最小割即为对偶图的最短路。
P7916 [CSP-S 2021] 交通规划
给定一个
的网格,但每一条边都是无限长的射线,格点间的小边有边权。 次询问,额外给定 个位于射线上的特殊点,并钦定了他们的颜色。你需要确定中间格点上的颜色,使得代价最小。代价计算的方式为:颜色不同的两个点之间的短边边权之和。颜色只有 0/1。
。
一半难度在读题和建对偶图(仅指代码实现)。
对于
考虑
考虑从
因为外面的点很少,只有
考虑最终的匹配结果,即割的形状,可以发现割一定不交,否则可以看做“碰头再返回”。因此最终的匹配是类括号序列的形式,区间 dp 即可求解。复杂度
太难写了!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?