网络流 学习笔记
众所周知,网络流是一类常用于求解最优化问题的算法,有着灵活的性质与较为优秀的复杂度
网络流学习的关键是对问题的抽象与建模,下面介绍一些常见的应用。
二分图上的应用
二分图最大独立集
考虑最小点覆盖的构造:从左部点所有失配点开始,走“匹配边-非匹配边”交替的路径,标记所有经过的路径,最后取左部未被标记的点和右部被标记的点。
反应到网络流上就是从源点出发,沿所有有残流的边搜(所有边初始流量都为1),标记经过的点。
最大独立集就取最小点覆盖的补集。
下面给出大致证明:
首先证明构造与最大匹配一一对应。首先对应左部点一定匹配,否则会被当为出发点标记;然后对应右部点一定匹配,因为右部点一定由一条匹配边到达;最后一条匹配边不可能两端点都在点覆盖内,因为右部点可以通过此边标记左部点。
然后证明覆盖了所有边,即不存在左右点同时不在点覆盖内。分类讨论:若此边为匹配边,左部点只能从右部点搜到,那么右部点一定被标记;若为非匹配边,左部点就能从右部点转移。
二分图的构造在各类匹配问题十分常见,如网格图黑白染色,还有填充模板类的问题。
最小割
平面图最大流等于最小割,可以处理一些“选不选”的问题,下面是一些经典的构造。
P4313 文理分科
考虑如何表示选择文理,一个点分别向源汇,建权值为文科/理科贡献的边。
考虑对所有点再建两个个点表示周围相同能产生的贡献。将它四周的点与它向新点建边,流量inf,再将两点分别连接源汇点,建权值为周围全为文科/理科产生的贡献的边。
这样如果A点连源,B点连汇,并且A,B有连边,那么A,B必须割“相同选择”的边,或者两个都连源,那么要割掉另一条额外贡献。
答案就是所有贡献和减去最小割。
拓展:BZOJ3511 (权限)
对于选择相同产生贡献直接套用经典模型,考虑如何处理不同选择产生的代价
考虑每次选择不同,会割去两条边,考虑给两条边分别加上
P3227 [HNOI2013]切糕
考虑对立方体所有坐标建点,然后建
考虑如何限制
这样的话可以如果割了一对距离超过
这一类问题可以拓展成对于数列
更多应用可以参考 djq 在 WC2023 的课件。
[SHOI2010]最小生成树
首先其他边减
考虑Kruskal的过程,即对于所有小于等于当前边(权
那么在原图保留权值小于当前边的边,边权改为
上下界网络流
无源汇上下界可行流
将原图边权赋为
考虑建立虚拟源点汇点,这样就可以补齐多余的流量。
给予点
若
有源汇上下界可行流
对源汇建
有源汇上下界最大流
在可行流基础上再跑一边最大流。
有源汇上下界最小流
在可行流基础上再跑一边最大流,然后去
其他
给定
考虑
P6967 [NEERC2016]Delight for a Cat
P3358 最长k可重区间集问题
CF818G Four Melodies
一个朴素的想法就是对所有符合条件的
考虑对所有点拆出
下面所有
为限制每个点只选一次
最后
最大费用最大流。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通