网络流24题,传说中学习的网络流的必做题目。今天终于做完了,感觉涉及的模型并不多,有一些我听说过的就没有涉及。但还是总结如下:
1 搭配飞行员 二分图最大匹配 最大流
建模:把正副驾驶员分别作为二分图,以在可以同机飞行的政府飞行员间建边,流量为1。建立源点s和正飞行员间的边,流量1。建立副飞行员和汇点t的有向边,流量1。dinic,最大流。
2 太空飞行计划 最大权闭合图 最小割
建模:建立源点s和汇点t,让s与所有试验相连接,边权为试验赞助的钱数;让所有仪器与t相连接,边权为仪器费用;让所有试验与对应的仪器链接,边权为inf,跑最大流就可以了。明显要么是赞助费大于仪器费,那么得到的是仪器费(赞助费-仪器费=收益);要么是仪器费大于赞助费,那么得到的是赞助费(不值得做,还是赞助费-赞助费=收益=0)。这样所有的赞助费减去得到的结果就是收益。
最大权闭合子图:http://blog.csdn.net/q610376681/article/details/52268346
3 最小路径覆盖 有向无环图最小路径覆盖 最大流
最小不相交路径覆盖:把每个点进行拆点,把2点之间连不边,;原有边依旧建边,注意入点和出点,权为1;建立源点和汇点,并分别连接他们与入点和出点的边,权为1。然后就是二分图匹配了。所有点数(不含源点和汇点)减去最大匹配就是答案。
通过上面的建图,拆点间的边表示原来的边,有用节点不能重复走,所有拆点间的边权为1。因为与源点或汇点的连边权为1,所以每一个点都只能作为边的起点或结束点一次。这样每找到一个匹配,两端的点就可以串在一个路径上,可以减少一条路径。所以点数-最大匹配=ans
学习:https://www.cnblogs.com/justPassBy/p/5369930.html
4 魔术球 有向无环图最小路径覆盖 最大流
实际上还是上一个题,只是改为询问可以放多少个球。采用每次个数加1的方法加边,然后跑最大流。这样如果球数-dinic()>柱子数,证明放不下了,答案就是球数-1。
5 圆桌聚餐 二分图多重匹配 最大流
建模:建立源点s和汇点t,建立s点到代表队的边,权为代表人数;建立餐桌到汇点的边,权为餐桌的人数;建立代表队到每一个餐桌的边,权为1;跑最大流。
6 最长递增子序列 最多不相交路径 最大流
第一步:最长上升子序列长度,可以用DP得到。同时的到f[i]:表示到第i个数并以之结尾的最长上升子序列长度。
第二步:求最长上升子序列的条数。因为每个数只能用一次,所以每个点拆点,并连接边权为1的边。连接可能(f[]相连并且数值增加)的连接边,权为1。连接s与所有f[i]==1的点,连接t与所有f[i]==最长上升子序列长度 的点,边权1。跑最大流,就是答案。
第三步:同上一步,只是第1点和第n点可以使用多次,所以,拆点时权为inf。
7 试题库 二分图多重匹配 最大流
建模:建立源点s和汇点t,连接s点与每种类型点的边,权为所选类型的数量;连接各个类型点与对应类型的题目的边,权为1,每个类型只选择给题目一次;连接每个题目和汇点t的边,权为1,每个题目只选1次。跑最大流。
输出:如果走了这条边,那么他的反边流量一定为1
8 方格取数 二分图点权最大独立集 网络最小割
建模:建立源点s和汇点t,让s和t分别于二分图的一侧相连,边权为方格内的数。连接相邻的方格边权为inf,求最大流(最小割)。结果就是所以格内数的和减去最小割。明显选了中间的方格就不选周边相邻的方格,所以就割边在对应的边上。
学习:https://www.cnblogs.com/jianglangcaijin/p/6035945.html
最大独立集=所有点-最小独立集
9 餐巾计划 线性规划网络优化 最小费用最大流
建模:典型的费用流。初做该题,关键在于把每天想象成两个点,需要的干净餐巾(B)和用过餐巾的处理(A);还有s,t的理解,可认为用过的通过s,t作为管理站进行分发处理。这样每天需要的干净毛巾由三个来源,新购入s,慢洗A(i-n),快洗A(i-m);每天用过的餐巾有三个处理渠道,慢细B(i+n),快洗B(i+m),留待明天处理A(i+1)。在加上每天需要餐巾和用过餐巾都是cost(i),可以理解为干净的餐巾由源点s代购,用过的餐巾由汇点t收集,再由s点转给各个用过餐巾点。
学习:http://blog.csdn.net/ruoruo_cheng/article/details/51527417
10 软件补丁 最小转移代价 最短路径
这是网络流吗?分明就是一个状态压缩最短路。分别记录有一种状态到另一种状态所需要的条件和产生的变化。求从全部漏洞到没有漏洞的最短路经(时间)。
11 数字梯形 最大权不相交路径 最小费用最大流
实际就是最大费用最大流。
数字点进行拆点连边,如果点或者边只可以走一次就把流量设为1,费用为点权相反数,当然边的权为0。建立源点和汇点,求最小费用最大流,输出相反数,OK!
12 运输问题 网络费用流量 最小费用最大流
源点s到各个仓库点建边,流量为货物量,费用为0;各个商店点到汇点t,流量为需要的货物量,费用为0;各个仓库和各个商店连边,流量inf,费用为对应两点件运输的费用,跑最小费用最大流,OK!
13 分配问题 二分图最佳匹配 最小费用最大流
建立源点s,并连接s到人的边,流量为1,费用为0;建立汇点t,并连接工作到t的边,流量为1,费用为0;连接每个人到每一项工作的边,流量为1,费用为对应的效益,跑最小费用最大流,得到最小收益。如果把费用取反,求最大费用最大流,得到最大收益。
14 负载平衡 最小代价供求 最小费用最大流
建立源点s到每个点的边,流量为点的货物量,费用为0;建立各个点到汇点t的边,流量为所有货物的平均数,费用为0;建立每个点和上一点和下一点的边,流量为inf,费用为1;求出最小费用最大流,OK!
15 最长k可重区间集 最大权不相交路径 最小费用最大流
建模:对所有区间的左右端点进行离散化,连接前一点到后一段的边,流量inf,费用0;建立源点s到1号点的边,流量为k,费用为0;建立随后一个点到汇点t的边,流量为k,费用为0;建立每个区间的左右端点的边,流量为1,费用为区间长度。跑最大费用最大流。相当于跑了k次最短路,并把对应的路废掉。
16 星际转移 网络判定 分层图最大流
建模:按照时间进行分层。依次枚举时间,时间每增加以,则增加(太空站+2)个点(一层),连接上一次与这一次的点,边为飞船可从上一时刻的某站到这一时刻的某站,边权为飞船的容量。s代表地球,t代表月球。跑最大流,如果人数大于等于需要运送的人数,则输出时间,否则时间加1,增加一层,继续跑最大流。
17 孤岛营救问题 分层图最短路径 最短路径
分层图最短路,是网络流吗?
按照钥匙的状态分层,也就是表示当前状态的变量有坐标(x,y)还要加上当前拥有的钥匙z。当然钥匙状态z需要状态压缩。然后spfa求最短路,其中到达目标的最短路就是答案。
18 航空路线问题 最长不相交路径 最小费用最大流
建模:从西到东再到西,实际上就是从西向东飞两次。最东和最西的城市拆点后流量为2,其他城市拆点后流量为1,费用为-1;在连接直航的边,流量为1,费用为0,跑最小费用最大流,OK!但是,如果只有东西两个城市,也就是流量为1,那么要进行特判。
恶心人的是,所有城市都是字符串,要用到map
19 汽车加油行驶问题 分层图最短路径 最短路径
该题与题17基本相同,在坐标(x,y)的基础上增加当前点剩余的油量z,这样F(x,y,z)表示在(x,y)点,在剩余油量为z的情况下的最小花费。跑spfa。
注意点:当油量变为0时,自动建立油站并充满油;到油站自动加油;还有一个坑,当到达终点刚好油量为0时,不再加油。
20 深海机器人问题 线性规划网络优化 最小费用最大流
建模:费用流,没什么好说的。有一点当时比较懵,如何只有第一次获得费用,实际方法很简单:建2条边,一条流量1,费用是指定值,一条流量inf,费用为0。
21 火星探险问题 线性规划网络优化 最小费用最大流
同上一题一样,只不过是把方格拆成2个点,2个点间件两条边。
不过,第5个点没有过,不知道为什么!!!
22 骑士共存问题 二分图最大独立集 网络最小割
首先要建立二分图。然后求最大流。最大独立集=所有点数-最小点覆盖
23 最长k可重线段集问题 最大权不相交路径 最小费用最大流
建模方法与第15题相同,全部在于由的点断可能出现竖直的情况,也就是两端点相同,这样跑最大流会有负环。因此在离散时要把左右端点做一下处理,也就是乘以2,如果两端点不相等,右端点减1,相等则左端点减1。
24 机器人路径规划问题 最小费用最大流(未做)
来源:https://www.cnblogs.com/gryzy/p/8466429.html