网络流
最大流
基本概念
原点s,汇点t,流量,容量
最大流问题原型:水渠问题,有一些水渠,由很多阀门连接,阀门控制水的流速,水渠内水单向流动,给定起点和终点,求最大流速
容量:每条边最大流速
流量:每条边水的流速
最大流:从s到t的最大流量
增广路:一条从s到t的可行路径
原理
每次找到一条增广路后就将整个路径的容量减去路径上的流量,然后再在整个路径的所有边的反边的容量上加上流量
EK算法
每一次bfs找到一条最短的路径,进行增广(就是原理所述操作),直到s与t不连通,
dinic算法
我们先将图用bfs分层,然后再用dfs,然而dfs的路径只能从当前层走到更深一层,我们会发现,这样找出的所有路径一定都是当前能找到的最短路径,就统一进行增广操作
如此进行多次bfs和dfs,直到s与t不连通,
经典模型
最小割
去掉一些边,使得原点到汇点不连通,求去掉的边的容量总和的最小值
定理:最大流=最小割
尝试解释,最大流相当于是利用了所有的增广路中的最小容量的那一条边,同时也覆盖了所有的增广路,使得选了这些边之后图不连通
二分图最大匹配问题
我们建一个原点,一个汇点,原点向二分图一边的所有点连一条容量为1的边,另一边的所有点向汇点连一条容量为1的边,原来图上的边容量为1,然后跑一遍网络流,就是最后的答案
尝试解释,原点向左边的点连一条容量为1的边,表示我们最多这个点最多只能选择一条边,从右边向汇点连的一条容量为1的边也是一样,相当于也是只能选一次,然后我们求出来的最大流相当于是能选的最大数量
最小点覆盖问题
题目:选定一些点使得这些点能覆盖到所有的边,求能选的最小的点
定理:最小点覆盖问题等价于二分图最大匹配问题
尝试解释
最大权闭合子图
闭合子图:对于子图内每一个点的后继节点都属于子图
问题:每一个点有权值(有正有负),然后求一个最大的闭合子图使得包含的总权值最大
首先正的越多越好,负的越少越好,根据经典套路,我们建一张二分图,正的点和原点连边边权即为点权,负的点和汇点连边,边权为点权的绝对值,然后跑一下最小割
我们考虑闭合子图,一个点如果被选了,它的后续节点,也就是所有能到达汇点的增广路就必须选所以说要么我们不选这个点,就砍掉其连向原点的边,或者说我们选这个点,但是选了的点的后续节点,就是能与它相连的点都不与汇点连通,就是砍掉那些点与汇点的边
所以说所有与原点连通的点相当于我们保留的点,与汇点连通的点就是要删去的点,然后考虑跑一遍最小割就会把图分为两部分,同时最小割的答案由两部分组成,一部分正权点,就是我们不选的正权点,删去的代价,另一部分是我们选的负权点的代价的绝对值
最后答案=正权点和-(删去的正权点代价+选择的负权点价值绝对值)=正权点和-最小割
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!