网络流
网络流
做题小套路:
- 考虑某些点和某些点捆绑, 串联或构造最小割。
- 考虑流要在某些点储存, 建立分层图。
网络流24题
飞行员配对方案问题
二分图最大匹配, dinic直接跑, 复杂度 \(O(n \sqrt m)\)
P2762 太空飞行计划问题
题目说明选择一些实验就必须要选择一些仪器, 但很多实验需要的仪器有重复,直接建图跑网络流肯定不行。 考虑用最小的割的思路去思考, 最大 = 总数 - 最小。 我们发现这么建图。

如果去划分这个图, 也就是割, 如果一个实验在 \(S\) 这个集合, 那么它的所有需要的仪器都在 \(S\) 。 这个性质就很够用了, 在发现最小割里面的值有两部分组成, 仪器和实验, 也就是汇点\(T\)与仪器之间的边被割掉, 被分到了\(S\)集合, 实验与源点\(S\)之间的边被割掉, 实验被分到 \(T\) 集合, 这样我们发现实验的收入和减去最小割刚好就是答案!!!只需要把仪器的边权设成绝对值即可。
P2764 最小路径覆盖问题
考虑最初有 \(n\) 条路径, 把每个点拆成入点和出点, 这样就会构成一个二分图, 考虑这上面的一条匹配就是合成了一条路径, 想的更细一点, 就是想dinic跑网络流流量加一, 相当于就是增广路翻转, 也就是多合并了一条路, 所以答案就是 \(n\) 减最大流。
P2765 魔术球问题
转化问题, 与最小路径覆盖问题相似。
P3254 圆桌问题
二分图最大匹配问题, 很简单。
P2766 最长不下降子序列问题
最开始读错题了。。问题1直接算, 看时间复杂度其实没必要用树状数组, 因为考虑到我们还有二三问, 用树状数组优化的其实我们丢失了一些信息, 直接 \(n^2\) 完全可以, 到后面发现果然, 考虑第二问, 不能重复用, 看起来和匹配很像? 所以考虑拆点求最大匹配, 我们钦定连一条边就代表将两点合并(其实又和前面的路径覆盖有点像), 然后跑最大流就行了, 第三问说 \(x1\\ x2\)随便, 改一下边权就行了。
P2763 试题库问题
考虑一道题只能对应一种类型, 所以类型连向汇点, 容量为其数量, 源点向每道题连容量为1的边, 每道连向其对应的类型, 容量为1, 如果最后跑满, 则说明一定有解, 这很好理解吧。
P2774 方格取数问题
考虑有权值, 这就是选了某一个方格, 它相邻的都不选。 并且我们发现如果黑点选择, 不选的只能是白点, 这不就和太空飞行计划问题一样吗!!!!把黑白点之间连容量为INF的边, 这样必定不会割他们, 我们考虑如果某黑点在 \(S\) 集合的话, 他相邻的两个白点必定被割了, 所以最后答案都是总和减最小割, 网络流真是太巧妙了, 一切都是刚好的样子!!!!
P1251 餐巾计划问题
考虑可以送去洗和保存的操作, 会发现一个点不大够用, 所以拆点, 拆成起始点和结束点。
- 送去快洗, 结束点连向几天后的起始点, 容量INF, 费用为P。
- 慢洗和快洗本质相同。
- 保存纸巾, 结束点连向第二天的结束点。
- 购买纸巾, 从源点连向起始点, 流量INF, 费用为p。
- 考虑从逻辑上来讲, 起始点应该向结束点, 结束点向汇点连边, 但这样网络流似乎跑不起来, 结束点运到汇点的纸巾就没了, 然后纸巾又要从源点买, 显然不正确, 所以再考虑, 源点还要向初始点连容量为INF费用为0的边?考虑这样跑网络流明显不对, 这样子就永远不会从有费用的那条边走了。再考虑初始点的入流量都表示干净纸巾, 这些纸巾往哪里流, 流向自己的结束点? 显然这样建图网络流也跑不起来, 只能连向汇点, 表示提供干净纸巾, 那么我们就可以从源点连向结束点表示得到脏纸巾。这样有点反直觉, 但是我们有时候不能纯跟着逻辑走, 也应该去考虑网络流的可行性。
其实也可以这么考虑网络源点汇点的流量守恒, 而餐巾每天的使用的干净纸巾数量等于产出的脏纸巾数量, 这也启示我们将其连向汇点。
P4015 运输问题
考虑送出总量等于接受总量, 我们可以联想到源点和汇点流量守恒, 所以考虑源点连仓库, 仓库连向每个商店, 商店连向汇点。
P4014 分配问题
考虑和前一题基本一样。
P4016 负载平衡问题
思路1: 考虑怎么才能平衡, 就是都是平均数。我们依然考虑运出量总和等于运入量总和, 所以大于平均值的就源点连向他, 低于平均值的就连向汇点, 再验证确实可以做, 相邻之间就按题意连就行了。
思路2: 与均分纸牌比较像, 可以推柿子。
P3358 最长k可重区间集问题
考虑一条线段会覆盖很多点, 一个点不能同时被覆盖超过k次, 类似志愿者招募的, 考虑拿流的容量去限制覆盖次数, 如果两条线段不相交, 我们可以直接拿容量为1的去串联他们, 所以考率在数轴上, 相邻两数费用为0, 容量INF, 没什么意义, 就是让网络流能跑起来, 每条线段 \(l\) 向 \(r\) 连一条费用为 \(-len\) 容量1的边, 考虑每个点与之平行(可以认为是并联)的流不能超过k, 所以我们考虑初始流设为k。最大流跑满使我们尽可能的多选, 费用流是我们尽可能的优选。
这似乎是一点对多点的套路。
网络流其他题
P1402 酒店之王
这又是一道二分图最大匹配, 最开始想的是人没有什么异议, 直接菜和房间连边就行了, 但又发现边太多了, 所以把人放中间, 喜欢的菜和喜欢的房间都连向他, 这样网络流可以自由组合, 但考虑这样子一个人可能会霸占很多菜和房间, 所以拆点, 在两点间加一个容量为一的边表示限制。
Exploration plan
这道题挺好的, 我没想出来, 最开始想的是和星际转移问题有点像, 但是那样边数有点难办, 所以考虑二分, 单调性是显然的, 时间越多越可能达到条件。 二分答案的话就考虑怎么check, 有一个贪心策略就是让每个团队到不同的点, 那这不就是二分图最大匹配。直接搞, 时间复杂度 \(O(logVn\sqrt m)\)
P2825 [HEOI2016/TJOI2016] 游戏
好题好题
感觉思维被固化了。。。很难受。 考虑和方格取数很像, 但是这道题不能黑白染色, 所以考虑怎么构造才能使其满足二分图的性质, 也就是一边的所有点不能互相连边, 我们依旧考虑一下如果点表示的就是棋盘上的某一点, 我们若选了某一点, 则会有一堆点不能选, 我们要试图让这些点串联才行, 或者用最小割的思路, 他们都不被割掉。 考虑最小割的话, 其实很接近, 但是我们不能把这些点划分, 所以割不掉, 所以考虑串联, 串联之后容量设为一, 这样就可以限制不让其他流进来, 就满足了条件。
我们就会神奇的发现, 同一行的两个硬石之间, 所有点要互相串联, 那想到什么???!!!缩点!!!把同一行或同一列两个硬石之间所有点缩为一个点。
建图:
- 源点 \(S\) 连向所有行的缩点, 列的所有缩点连向汇点。
- 我们考虑现在求答案就是求二分图最大匹配, 因为一个联通块内最多一个点被选中, 选中一个点必定会关联一个行的缩点或一个列的缩点。所以对于每一个原图的点, 其对应的行的缩点连向其列的缩点。
P4001 [ICPC-Beijing 2006] 狼抓兔子
对偶图最短路。
P4313 文理分科
很典的一道题, 但没切掉, 很遗憾, 看了题解发现思路很简单, 我的思路还是不清晰, 不简洁。
考虑简单的情况: 只有文理选科的贡献, 直接源点连那个人, 容量为文科满意度, 那个人连汇点, 容量为理科满意度, 最后总和减最大流, 因为最小割等于最大流, 其实这里还有助于感性理解最大流最小割定理。
再考虑相邻的情况, 考虑 \((i, j)\) 这个人要获得相邻都选文科带来的附加满意度, 那么就要割掉相邻的人的理科满意度, 加上这个人的文科附加满意度, 那建图就呼之欲出了, 建一个新点, 源点连向它, 它连向相邻的那几个人对应的点, 容量INF, 那几个人再连向汇点。
P1361 小M的作物
虽然和文理分科很像, 但是有了不一样了思考, 其实也是和太空飞行计划很像, 就是选了一个必须选择其所有后继, 直接最小割。
切糕
考虑割边其实就是某条路径的最小容量, 也就是最大流, 这么理解有些时候有助于构造。
很好的一道题, 但还是看了题解才做起, 考虑没有限制, 直接从上连到底, 容量就为上一个点的权值, 最小割就直接是答案, 考虑限制, 就是如果在某一列上割某一条边, 相邻的数轴割的边必须在这条边的 \(+-D\) 范围内, 所以考虑加INF边至于怎么加, 我最开始考虑往其 \(+D\) 连边, 但是你会发现, 我们用最大流的角度来思考, INF边往下连的话流不久下来了吗, 所以向上, 这样就限制相邻两数轴的割边之间距离一定在 \(D * 2\) 以内。
广义切糕模型之最小割离散变量模型
2016 年的候选队论文《网络流的一些建模方法》(姜志豪)给出了一种最小割建模方法——最小割离散变量模型 .
P3705 [SDOI2017] 新生舞会
挺板的一个题, 01分数规划, 二分答案然后就是二分图带权最大匹配。
[ARC125E] Snack
网络流神题, 太牛啦。
考虑可以一看出来网络流模型, 但是这里建边太多了, 要死掉。。。
所以考虑这道题, 每个对于每个种类零食都只能吃 \(b_i\) 个, 暗藏玄机, 所以肯定有其他办法可以求出这个最大流, 我们考虑最大流最小割定理。 怎么求最小割, 考虑对于人的贡献只与再 \(S\) 集合中的糖果数量有关, 所以可以小贪心一下, 优先割掉 \(a_i\) 小的边, 人的贡献为 \(min(c_i, k \times b_i)\), 考虑随着 \(k\) 的增加, 人的取值为前一半为 \(c_i\), 后一半为 \(k \times b_i\) , 也就是说每个人的贡献在我们枚举 \(k\) 的时候最多变化一次, 那么总共献最多变化 \(O(n)\) 次, 所以我们可以 \(O(n)\) 解决问题啦。
补充: 考虑断零食与 \(S\) 的边, 对 \(b_i\) 的影响只与断 \(a_i\) 的数量有关, 所以对于 \(a_i\) 可以直接贪心断小边。
总复杂度 \(O(nlogn)\) 瓶颈在排序

浙公网安备 33010602011771号