网络流题型总结
最近写了一段时间的网络流,现在应该总结一下了。
网络流就是将原问题抽象成包含顶点和边有容量限制的网络。
本文中有些题目的题解复制自网络,仅作个人学习总结之用。
1.最大流#
最大流可以看作使用 flow
来做出一系列的限制,从而满足原题条件。
1.1 拆点
有时候某一个点还有额外的限制,这个时候就需要把一个点拆成两个点,用它们之间的边来描述限制。
LG2472 [SCOI2007] 蜥蜴
将整个网格地图看作一个网络,,某一个节点拆成两个点(称为左端点和右端点),之间连一条边表示跳的青蛙的限制数。相互之间如果可以通达就从右一端点向左一端点连边。s 向所有有青蛙的左端点连一条容量为青蛙数的边。能通达外部右端点向 t 连一条容量为 inf 的边。
1.2 分层图网络流
基于时间等因素,网络状态有所改变,这时候就需要构建分层图。
LG2754 [CTSC1999] 星际转移问题
注意到每个太空船的位置在随时间的改变而改变。
基于时间构建分层图。
首先判断无解,即地球和月球没有被太空船联通(并查集判断)。
我们将所有空间站+地球+月球称为一层节点。
接着枚举时间,每一新时刻构建一层节点,根据太空船的位置关系从上一层节点向这一层节点连边,容量限制为太空船的载客量,直到最大流大于等于地球人数 k。
由于 dinic 残量网络的性质,我们可以每次在残量网络上跑 dinic,将新增的流直接加到最大流上,因此时间上远远小于跑 t 遍 dinic 的理论复杂度。
LG2766 最长不下降子序列问题
[问题分析]
第一问时LIS,动态规划求解,第二问和第三问用网络最大流解决。
[建模方法]
首先动态规划求出 F[i]
,表示以第 i 位为开头的最长上升序列的长度,求出最长上升序列长度 K。
1、把序列每位 i 拆成两个点 <i.a>
和 <i.b>
,从 <i.a>
到 <i.b>
连接一条容量为1的有向边。
2、建立附加源 S
和汇 T
,如果序列第 i 位有 ,从 S
到 <i.a>
连接一条容量为1的有向边。
3、如果 ,从 <i.b>
到 T
连接一条容量为 1 的有向边。
4、如果 且 且 ,从 <i.b>
到 <j.a>
连接一条容量为1的有向边。
求网络最大流,就是第二问的结果。把边 (<1.a>
,<1.b>
),(<N.a>
,<N.b>
),(S
,<1.a>
),(<N.b>
,T
) 这四条边的容量修改为无穷大,再求一次网络最大流,就是第三问结果。
[建模分析]
上述建模方法是应用了一种分层图的思想,把图每个顶点 i 按照 F[i] 的不同分为了若干层,这样图中从S出发到T的任何一条路径都是一个满足条件的最长上升子序列。
由于序列中每个点要不可重复地取出,需要把每个点拆分成两个点。单位网络的最大流就是增广路的条数,所以最大流量就是第二问结果。
第三问特殊地要求 x1 和 xn 可以重复使用,只需取消这两个点相关边的流量限制,求网络最大流即可。
1.3 二分图匹配
根据二分图匹配的性质,可以使用网络最大流求解。
同时二分图多重匹配可以使用网络最大流求解,二分图带权最大匹配可以使用最小费用最大流求解。
这一类题型的难点一般在于二分图的建模,而不是网络流模板的使用。
1.4 二分图最小点覆盖
给定一张二分图,求出一个最小的点集 S,使得途中任意一条边都有至少一个端点属于 S。
二分图最小点覆盖包含的点数等于二分图最大匹配包含的边数
1.5 二分图最大独立集
图的独立集指的是“任意两点之间都没有边相连”的点集。包含点数最多的一个就是图的最大独立集。
图的团指的是“任意两点之间都有一条边相连”的子图。点数最多的团被称为图的最大团。
无向图 G 的最大团等于其补图 G' 的最大独立集
设 G 是有 n 个节点的二分图,G 的最大独立集大小等于 n 减去最大匹配数
LG3731 [HAOI2017] 新型城市化
我们把每个城市看作一个点,在“当前没有贸易关系”的城市之间连边。
此时,如果一个城市集合是一个城市群,那么这个城市集合中的任意两个城市之间都没有边。
因为“可以划分为两个城市群”,所以这个图是个二分图。
那么“最大城市群”就是二分图的最大独立集。
“在两个城市之间建立贸易关系”即删除这两个点之间的边。
所以题目实际上是,给一个二分图,问删掉哪些边之后,最大独立集的大小会增加。
考虑如何求最大独立集大小。
最大独立集大小=总点数-最小覆盖集大小=最大匹配数。
也就是说,这个题问的是,给一个二分图,问删掉哪些边之后,最大匹配的数量会减少,也就是问,哪些边一定在最大匹配里。
这个时候,我们已经得到了50分做法了。
先建出网络流,求出最大匹配数量,然后删掉一条边重新跑一次,看最大匹配是否减少,就是我考场上的做法。
用退流可以做到更优越的复杂度,但好像过不了n=500的点?
接下来考虑满分做法。
考虑如下定理:若一条边一定在最大匹配中,则在最终的残量网络中,这条边一定满流,且这条边的两个顶点一定不在同一个强连通分量中。
证明也很简单:首先满流的要求是很显然的,其次,如果这两个点在同一个强连通分量中,那么一定有一个环经过这条边,沿着环增广一下,网络仍然满足流量限制,但是这条边就不满流了,于是就得到了一组新的最大匹配。
所以只要跑完Dinic跑Tarjan就好了。
1.6 最小路径点覆盖
在一个有向无环图中,找出最少的路径,使得这些路径经过了所有的点。
构建模型,定义原有向图为 G,新图为 G2。
将 G 拆点,分为左部点和右部点,令 G 中节点 x
的左部点为 l(x)
,右部点为 r(x)
。若 G 有边 (x,y)
,那么连边 l(x)
与 r(y)
。这样作出的二分图就是 G2。
G 的最小路径覆盖 = n - G2 的最大匹配
LG2765 魔术球问题
两个能构成完全平方数的数之间小数向大数有边,不断加入新数,直到最小路径点覆盖 > 柱子数 n。最终答案就是加入的数的个数减一。
还有就是要输出路径,根据网络流的性质,一条边满流了就说明两点之间应该是同一根柱子的相邻关系,枚举一下边最后按照上述关系输出即可。
2. 最小割#
2.1 最大权闭合子图
给定一个有向图,点有点权,选择一个子图,满足子图上如果选择了一个点就必须选择它后继的所有点。最大化点权和。
建图:
- 源点向所有正权点连结一条容量为权值的边
- 保留原图中所有的边,容量为正无穷
- 所有负权点向汇点连结一条容量为权值绝对值的边
正权点被割掉表示不选,负权点的边被割掉表示选。
原图的最大权闭合子图的点权和即为所有正权点权值之和减去建出的网络流图的最小割。
最大权闭合子图模型有着广泛的应用。
LG2762 太空飞行计划问题
按照模型建图,不多赘述。
LG2805 [NOI2009] 植物大战僵尸
先拓扑排序,去除掉相互包围的节点,求出能够到达的节点。每一个节点都向其前一个节点连边,如果其被保护,还需要向保护它的节点连边。意思就如果想要消灭该节点,就必须消灭依赖的节点。
最后根据模型建图连边。
LG3749 [六省联考 2017] 寿司餐厅
将所有区间看作节点,权值为美味度。那么选定了 ,就需要选择 。
考虑付出的花费可以分成两部分 —— 。
是定值,对每个寿司的代号新建节点 表示。, 要向 连边。
是对于每选一种代号为 x 的寿司,都需要付出 x 的花费。 减去 即可。
至此,所有关系都可以用最大权闭合子图的形式描述。
二分图上的最小割
将节点分为两类,两类点之间有一定的约束关系。
LG2774 方格取数问题
我们对棋盘进行黑白染色((横坐标+纵坐标)%2==1的点设为黑点),可以发现,若取一个黑格的点,受到影响的就是周围的白点。
于是我们可以建一个二分图。
然后可以发现这是一个最小割的套路题,假设所有的点都取,然后去掉最小割,就是答案了。
建模:S->黑点,容量为点权。
白点->T,容量为点权。
每一个黑点->取该黑点会受到影响的白点,容量为 inf。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下