网络流24题做题记录

网络流24题做题记录

前置芝士

算法:匈牙利算法,dinic,EK(zkw费用流)。

一些模型:二分图匹配,二分图最佳匹配,最大权闭合子图。

(按做题顺序记录,可能不是按难度)。

1.飞行员配对方案问题

题意:有\(m\)个外籍飞行员和\(n-m\)个英国飞行员,要求两两匹配,给出一组最大匹配。

思路:裸的二分图最大匹配,直接上dinic即可。

2.圆桌问题

题意:有\(m\)个不同单位,第\(i\)个单位派出了\(r_i\)个代表,餐厅共有\(n\)张餐桌,第\(i\)张餐桌可容纳\(c_i\)个代表就餐,要求从同一个单位来的代表不在同一个餐桌,给出一个满足要求的代表方案,可能无解。

思路:首先是套路的源点向每个单位连容量为\(r_i\)的边,每个餐桌向汇点连容量为\(c_i\)的边。因为每个单位最多有一个人在坐在一张桌子上,因此每个单位向每个餐桌连容量为1的边,然后跑最大流即可。

3.试题库问题

题意:有\(n\)道题,每到题有一些属性,现在要出每种属性出\(c_i\)道题,要求输出方案或判无解。

思路:裸的二分图匹配,直接dinic即可。

4.软件补丁问题

题意:有\(n\)个漏洞要修复,有\(m\)个补丁,仅当漏洞集合包含\(b1_i\),与\(b2_i\)交集为空是可以使用,花费代价\(w_i\),而且可以修复\(f1_i\)集合的漏洞,并新添\(f2_i\)的漏洞,求修好\(n\)个漏洞的最小代价。

思路:考虑状压DP,但转移不是DAG,于是用最短路进行转移即可。

5.分配问题

题意:\(n\)件任务给\(n\)个人做,\(i\)\(j\)的时间是\(c_{i,j}\),求最小最大总代价。

思路:不会二分图最佳完美匹配,于是直接用费用流,源点向每个人连流量为1,代价为0的边,每个人向每件工作连流量为1,代价为\(c_{i,j}\)的边,每件工作向汇点连流量为1,代价为0的边即可。

6.运输问题

题意:\(m\)个仓库和\(n\)个商店,每个仓库有\(a_i\)件物品,每个商店要卖\(b_i\)件物品,从\(i\)工厂到第\(j\)个商店每单位\(c_{i,j}\)的代价,求总代价最大最小值。

思路:和上一题类似,就是改一下流量即可。

7.负载平衡问题

题意:环上有\(n\)个数,每次可以把一个数\(+x\),给它旁边的数(自己定哪一个)\(-x\),代价为\(x\),求使所有数相等的最小总代价。

思路:裸的均分糖果模型。

8.孤岛营救问题

题意:一张网格图,有些边是墙,有些边是门,需要钥匙,同时有一些网格里有钥匙,求从\((0,0)\)\((n,m)\)的最小时间。

思路:考虑到状态数\(nm2^p\)很小,于是可以考虑直接暴力广搜。

9.最长k可重区间集问题

题意:数轴上有若干区间,要求选出一些区间,使得每个点被覆盖的次数不超过\(k\),求区间总长度的最大值。

思路:对于每个点被覆盖的次数不超过\(k\),最先可以想到直接由每个点向汇点连容量为\(k\)的边,区间向其覆盖的所有点连边,但是这样可能会跑出来一个区间没有向所有被覆盖的点都有流量的情况,于是把每个点向汇点连容量为\(k\)的边改成每个点向后一个点连容量为\(k\)的边,最后一个点和汇点相连,区间直接把左右端点连起来。考虑到坐标可能很大,离散化后跑最大费用最大流即可。

9.75.[NOI2008] 志愿者招募

之所以是9\(\frac{3}{4}\)是因为 (致敬《哈利波特》) 这道题不是网络流24题里面的,但是和最长k可重区间集问题建模的方法类似,所以就放在一起。

题意:有\(n\)天,每天需要\(a_i\)个志愿者,有\(m\)类志愿者()每类无限个,会从第\(s_i\)天工作到第\(t_i\)天,每天\(c_i\)元,求最小总费用。

思路:和上一题类似,可以理解为每一个人覆盖了一段区间,而且必须取满。不过上一题是限流,这一题是强制满流,于是就直接每个点向后一个点连\(-a_i\)的边。不过考虑到网络流不会处理负流量,可以转为连\(inf-a_i\)的边。于是连边方案就呼之欲出了:源点向第一天、最后一天向汇点连容量为\(inf\),费用为0的边,每个志愿者从\(s_i\)\(t_i+1\)连容量为\(inf\),费用为\(c_i\)的边,最小费用最大流即是答案、

10.方格取数问题

题意:一张\(n\times m\)网格,每个方格中都有一个正整数。现要从方格中取数,使任意两个数所在方格没有公共边,且取出的数的总和最大,请求出最大的和。

思路:首先可以把网格图看成二分图,然后问题就转化成了求二分图最大权独立集,直接用总和减去最小割即可。(有人dinic写错了调了1h,警钟敲烂)。

11.魔术球问题

题意:有\(n\)个柱子,和编号为\(1,2\cdots\)的小球,要求:只能放在柱子顶端,且放入时和前一个球的编号和为完全平方数,求最多放入多少个球。

思路:发现这个问题很类似二分图匹配,于是拆点后只要最大流为\(n\)时即可输出点数和答案。

12.太空飞行计划问题

题意:有\(m\)个实验,每个实验需要若干类仪器,不同实验可共用同一种仪器,给每个实验的收益和每种仪器的花费,求最大收益。

思路:可以发现这就是一个最大权闭合子图问题,直接套用类似思路即可,注意输出方案是依据和源点\(s\)联通的点就是选择了的点。

13.最小路径覆盖问题

题意:给出DAG,要求用最少条数的路径覆盖所有点,所有路径不交。

思路:高级结论:最少路径覆盖=总点数-二分图最大匹配数。具体证明可以考虑每次贪心地选取两个首尾相连的路径进行合并,使答案减1,这样和直接求最大匹配是对应的。于是直接求最大匹配即可。输出方案只需在dinic是记录前驱后继即可。

14.最长不下降子序列问题

题意:①求最长不下降子序列长度\(s\);②如果每个位置最多用一次,最多可以取出多少长度等于\(s\)的不下降子序列;③如果\(a_1,a_n\)可以用多次,求最多可以取出多少长度等于\(s\)的不同的不下降子序列。

思路:第一问可以朴素DP,求出每个点结尾的最长不下降子序列长度\(f_i\)。对于第二问,我们可以发现一个性质,\(f_x=i\)\(x\)一定在选出的子序列的第\(i\)位,于是我们可以先拆点,然后对于\(a_j\geqslant a_i,f_j=f_i+1\)\((i,j)\)连边,最大流即是答案。对于第三问,把\(1\)\(n\)的边的边权改成\(inf\)即可。

15.航空路线问题

题意:按顺序给出\(n\)个城市,有些城市间有航道,先从\(1\)\(n\),再从\(n\)\(1\),要求城市不重复,求最多可以去到多少个城市。

思路:只会直接连边正反流一次然后发现不好处理每个城市只被经过一次。于是我们就用费用流,拆点后两个点间容量为1,费用为1,其他的边容量为1,费用为0,\(s\)和1、\(n\)\(t\)的边容量为2,然后跑最大费用最大流即可。输出方案的处理也还好,就是要注意处理编号问题。

16.数字梯形问题

题意:有上底为\(m\),下底为\(m+n-1\),高为\(n\)的数字等腰梯形,要求从上面\(m\)个数出发,只能向左下或右下走,求①路径不能相交②路径可以在数字处相交③路径可以在数字处或边相交时\(m\)条路经上数字和的最大值。

思路:比较板的费用流。对于第一问,把每个点拆成两个点,中间连容量为\(1\),费用为数字大小的边,源点向上底、下底向汇点连容量为\(1\),费用为\(0\)的边。对于第二问,一个数字可以被曲多遍,只需把拆成的点间的边、下底和汇点的边流量设为inf即可。对于第三问,再把数字间的边流量设为inf即可。

17.深海机器人问题

题意:有\(n\times m\)的网格,边上有一个数,有\(k_i\)个机器人从\((x_i,y_i)\)出发,只能往\((n,m)\)移动,有\(s_i\)个目的地\((tx_i,ty_i)\),每条边上的数只能被取一次,求取到的数的和的最大值。

思路:比较板的费用流。两点间连容量为\(1\),费用为数字大小的边,再连容量为\(inf\),费用为0的边,最后源点向起点、终点向汇点连边,然后跑最大费用最大流即可。

18.骑士共存问题

题意:在\(n\times n\)的网格上,有些格子是障碍,现在要放入一些骑士(和马一样走“日”),使得他们互不攻击,问最多放入多少个。

思路:又是一道把网格图转化成二分图的题。首先,每走一个“日”字,坐标和的奇偶性改变,于是把网格图按坐标和的奇偶性分成两部分,两部分的内部没有连边,两部分之间会有一些边,然后就相当于是要求二分图最大独立集,于是套路性地转化成总点数-最大匹配,用dinic解决即可。

19.最长k可重线段集问题

题意:平面上有\(n\)个开线段,现在要选出若干个线段,使得任意对于每条直线\(x=p\),最多有\(k\)条线段与之相交,求选出的线段长度和的最大值。

思路:和9.最长k可重区间集问题类似,只是要处理两个线段都与\(x\)轴垂直的情况,这时只需把横纵坐标都\(\times2\),然后就可以类似处理,再跑最大费用最大流即可。

20.火星探险问题

题意:在\(n\times m\)的网格上,每个点可能是障碍或石块或什么都没有,现在有\(k\)个机器人从\((1,1)\)出发到\((n,m)\),每个石块最多被采集一次,要求输出采集的石块最多的每个机器人移动方案。

思路:比较板的费用流,每个点拆点后直接连边,跑最大费用最大流即可。比较不好处理的是输出方案。记录一下自己做这题敲的警钟:1.\(t\)设成了\(n\times m+1\)导致出现了正环;2.输入的\(n,m\)搞反了;3.输出方案时少打了"&"导致只对了一个点。

21.餐巾计划问题

题意:有\(n\)天,每天需要\(r_i\)个餐巾,每购买一个新的餐巾\(p\)元,也可以洗用过的餐巾,可以花\(c_1\)元用\(t_1\)天洗完,也可以花\(c_2\)元用\(t_2\)元洗完,求最小花费。

思路:不太好直接就想出来的费用流。先拆点,对于每天的限制,由源点向\(i\)\(i+n\)向汇点连容量为\(inf\),费用为0的边,对于每天可以新买,由源点向\(i+n\)连容量为\(inf\),费用为\(p\)的边,对于清洗餐巾,由\(i\)\(i+n+c_1\)连容量为\(inf\),费用为\(t_1\)的边,\(c_2,t_2\)同理,然后跑最小费用最大流即可。

22.汽车加油行驶问题

题意:1辆油箱容量为\(k\)的汽车从\((0,0)\)\((n,m)\),每个网格点上是0或1,1表示有加油站,规定车到加油站一定要花\(a\)的代价把油加满,0表示没有,但可以花\(c\)建一座加油站,如果行驶时\(x\)\(y\)坐标减小应支付\(b\),出发时油箱是满的,求到终点的最小花费。

思路:考虑对汽车每种油量建分层图,然后跑最短路即可。

23.[CTSC1999]家园 / 星际转移问题

题意:\(k\)个人从地球到月球,有\(n\)个空间站和\(m\)个飞船,每个飞船按固定线路循环飞行,求让所有人都到月球的最小时间。

思路:同样是分层的思路,建图跑最大流即可。

其实还有第24题,但(可能?)好像是个假题,那就不管了,留到以后再处理吧。

posted @ 2023-04-27 21:56  Xttttr  阅读(78)  评论(0编辑  收藏  举报