网络流初级复习
前言#
本人初识网络流后,基本上没什么接触,这两天专门训练,加深了对网络流得巩固。
本文只基于初级巩固介绍网络流算法。
前置知识#
-
初步了解网络
-
会写 EK 板子
-
会写 Dinic 板子
网络流的三个性质#
EK 算法证明#
- 残量调整定理:原图上的任何一种合法流,都可以从残量网络上调整得到。
证明:对于
- 时间复杂度:EK 算法时间复杂度为
。
证明:每一次
最小割#
- 最大流 - 最小割定理:最小割等于最大流。
证明:设最小割为
Hall 定理#
一张二分图,分别有
- 设
表示左部点集合 中的点连的右部点的并集。二分图存在完美匹配,当且仅当对于任意一个 个点的子集 ,满足 ,。
证明:必要性:若存在
- 推广:二分图的最大匹配数量为
证明:考虑建立网络流模型,跑最小割,上式其实就是最小割。
最小割树#
设
算法流程如下:
-
选择两个点
。 -
在原图上跑
的最小割。 -
最后拆成两个点集
,分别递归 。
建模分析#
- 匹配模型
如二分图:建立源点连接左部点,建立汇点连接右部点。
- 拆点技巧
把一个点
每个方格拆点,入点和出点连一条容量为
- 最小割处理“一面对多面”
源点向每个元素连边,每个元素向对应子集连边,子集向汇点连边。
不考虑权值,每条边容量为
不难发现这样的图最小割为
- 最小割处理 变量取值收益最小/大化+取值(差)限制
每个二维点看做变量
对于每个变量,在源点和汇点之间连一条链,链上边的容量依次是
我们需要算上限制,对于两个变量
每个点有三种情况:删除、收益为
有删除操作,考虑拆点,把每个点拆成入点和出点,入点和出点连一条容量为
类似于最小割的经典二选一问题,我们令源点向入点连一条容量为
但是有个限制:同一联通快内的点必须统一取
容量可能有负数,让所有都加
出处:https://www.cnblogs.com/Sktn0089/p/17609815.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下