学习网络流的一些心得


最大流

一般都是用dinic算法来求解

对于二分问题 我会把所有匹配的左点向右点连一条边 然后建立源点和汇点 从源点向所有左点建立一条边权为1的边 再从所有右点向汇点连一条边 跑一遍dinic求解出最大流即为最大匹配数

对与有上下界的网络流问题 我一般都会建立新图 可以参考这篇博客

对于关键边问题 我认为应该加强对网络流原理的理解 这种问题常常比较灵活
例如在问到在一个流网络中 增大一条边从而使最大流增大 问有多少条这样的边 我们可以在图中遍历所有u->v 找到 f[i] == 0并且从S可以到u以及从v可以到T 看看有多少条这样的边

对于最大流判定问题 一般都是用二分或者枚举+网络流的形式来求解 在这种题中求解最大流一般都是来判断当前的结果是否符合题目最优解 是否可以继续优化之类的问题

对于最大流拆点问题 这是最大流常见的题目技巧 将一个点拆为入点和出点 从而限制当前点的可利用次数


最小割

求解最小割问题多用dinic来求解

通过把边权设为无穷大从而使得求最小割的时候不会割掉这条边

问题多为最大权闭合子图
比如给定 物品a 选择 物品a 必须选择 材料1 和 2 这时候就建立源点S向所有物品连一条权值为物品a的收益的边 再把所有材料向汇点T连一条权值为该材料成本的边 dinic求最小割再用所有物品的总成本减去最小割即为答案 因为在这种问题中就是割掉边的问题 你可以选择物品那么就必须要割掉所对应材料与T之间的边 即要付出这些材料的成本 若不选择此物品 则要割掉所对应物品与S之间的边 即要付出这个物品的收益 最后用总收益减去最小割时就减去了这个物品的收益 从而代表放弃了这个物品的收益

最小割之最小点权覆盖图
只能解决二分图问题中的最小点权覆盖图问题
最小点权覆盖即为选出一个点子集 使得图中每条边中都至少有一个点存在于这个点集 并且点权和为最小值
对于这种问题要把点拆开 拆为入点出点 化为二分图用最小割求解

最小割之最大点权独立集
同理只能解决二分图问题
即为选出一个点集 使得这个点集中任意两点都没有一条边相连 用总点权和减去最小点权覆盖即可


费用流

把EK算法的 bfs 换成 spfa 每次找单位费用和最短路 从而实现最小费用

费用流最大权不相交路径 为实现路径不相交 可以通过拆点 来实现点上不相交 和 限制线的流量从而实现线上不相交

费用流之网格图模型 通过网格中相邻点或者能到到的点连线 已经建立源汇点 和起点终点相连来求最小或最大费用流

当一个地方的费用只能用一次时候可以建多边 一条为(1, c) 一条为(INF, 0)的边

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值