网络流24题 选做 题意+题解

Preface

最近做题感觉自己的网络流姿势不是很够,决定去做一做传说中的网络流24题,就有了这一篇Blog
有些太简单或者重复的就不写了

这些题LibreOJ上不少都有,直接搜网络流24题即可

[loj#6000] 搭配飞行员

一架飞机需要正副驾驶员恰好各一位,有一些正驾驶员和一些副驾驶员,他们之间有些能在一起合作。问最多能同时出发多少飞机。

直接二分图最大匹配,没什么好说的。

[loj#6001] 太空飞行计划

有一些仪器,费用为ci元,可以进行一些实验,每个实验依赖某些仪器(可能一个仪器被多个实验依赖),一个实验完成的收益为pi元
求最后总的最大化纯收益(即收益-费用)。

最小割模型(也可以理解成最大权闭合子图)。
源点向实验连容量为pi的边,实验向依赖的仪器连INF,仪器向汇点连ci,答案就是 ∑ p i − m a x f l o w \sum pi-maxflow pimaxflow

[loj#6002] 最小路径覆盖

给出一个DAG,问最少使用多少条路径,能覆盖每个点恰好一次(每个点恰好在一条路径上)。
拓展:
给出一个DAG,问最多能选出多少个点,使得选出的点中任意两个均不能一个到达另一个。(也叫最长反链)
有定理,最长反链=最小链覆盖。

考虑最小链覆盖数是什么,就是在选完链覆盖完以后没有出边在某条链上的点的个数。
也就是说最大化有出边的点数。

将每个点拆成入点和出点,源点向所有出点连1,对于原图的一条边(x,y),新图上连接out[x],in[y],跑最大流就是有出边的点数最大值,用n-最大流就是答案。

[loj#6003] 魔术球

假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1, 2, 3, 4,… 的球。

  • 每次只能在某根柱子的最上面放球。
  • 在同一根柱子中,任何 2 个相邻球的编号之和为完全平方数
  • 试设计一个算法,计算出在 n 根柱子上最多能放多少个球。

n<=55

考虑依次枚举答案,假设当前已经放完了1,2,3,…m-1,要放第m个。
我们枚举1~m-1,如果某个数x+m是一个完全平方数,那么从x向m连一条有向边
显然这是一个DAG
我们有n根柱子,一根柱子上的放球状态相当于DAG上的一条链
那么如果当前DAG中的最小链覆盖数大于n了就不合法了。

这样动态加点夹片,求最小链覆盖数,可以用网络流实现。

[loj#6004] 圆桌聚餐

假设有来自 n 个不同单位的代表参加一次国际会议。每个单位的代表数分别为 ri ​​ 。会议餐厅共有 m 张餐桌,每张餐桌可容纳 ci ​​ 个代表就餐。 为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。 试给出满足要求的代表就餐方案。

简单最大流,源点向每个单位连容量为代表数的边,每个单位向每个餐桌连1的边,餐桌向汇点连容纳量的边。

[loj#6005] 最长递增子序列

给定正整数序列 x1∼xn ​​ ,以下递增均为非严格递增。
你需要回答三个问题
计算其最长递增子序列的长度 s。
计算从给定的序列中最多可取出多少个长度为 s 的递增子序列。
如果允许在取出的序列中多次使用 x1 ​​ 和 xn ​​ ,则从给定序列中最多可取出多少个长度为 s 的递增子序列?
n<=500

首先可以DP求出 f [ i ] f[i] f[i]表示以i开头的最长递增子序列长度。
如果 f [ i ] = s f[i]=s f[i]=s,那么源点向i连1的边。
为了保证每个点只选一次,可以将每个点拆点,然后中间连一条容量为1的边。
如果 f [ i ] = 1 f[i]=1 f[i]=1,那么i向汇点连1的边

中间有转移关系的就相应连边
最大流就是答案。

第三问相应改拆的点中间的容量即可。

[loj#6007] 方格取数

在一个有 m×n 个方格的棋盘中,每个方格中有一个正整数。 现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。

其实这题与之前的太空飞行计划是相似的
方格与方格没有公共边,也就意味着不能选4相邻的格子。
考虑将棋盘黑白染色,那么只有黑白点之间有约束关系。
源点向黑点连数值的边,黑点向相邻的白点连INF,白点向汇点连数值的边。

最后总的数值和减去最小割就是答案。

[loj#6008] 餐巾计划

一个餐厅在相继的 n 天里,每天需用的餐巾数不尽相同。假设第 i 天需要 ri ​​ 块餐巾。餐厅可以购买新的餐巾,每块餐巾的费用为 P 分;或者把旧餐巾送到快洗部,洗一块需 M 天(可以同时洗多块),其费用为 F 分;或者送到慢洗部,洗一块需 N 天(可以同时洗多块),其费用为 S 分(S<F)。 每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量(注意干净餐巾不能保存必须洗完马上用)。 试设计一个算法为餐厅合理地安排好 n 天中餐巾使用计划,使总的花费最小。

我们将第i天拆成点xi,yi,代表干净的餐巾和脏的餐巾,xi向汇点连容量为ri,费用为0的边(注意不是xi向yi连)。源点向xi连容量为INF,费用为P的边。代表新买的餐巾。

源点向yi连ri的边,代表每天产生了这么多脏的餐巾
yi向yi+1连INF,费用为0的边,代表将脏餐巾屯到下一天。

yi向xi+M连INF,费用为F的边,代表送快洗
yi向xi+N连INF,费用为S的边,代表送慢洗

直接跑最小费用最大流即可。
(由于这样连边使得汇点的所有入边容量就是每一天的容量,因此跑最大流就意味着每天都要满足需求)

[loj#6015] 星际转移

现有 n 个太空站位于地球与月球之间,且有 m 艘公共交通太空船在其间来回穿梭。每个太空站可容纳无限多的人,而每艘太空船 i 只可容纳 Hi ​​ 个人。每艘太空船将周期性地停靠一系列的太空站,例如:1,3,4 表示该太空船将周期性地停靠太空站 134134134⋯ 每一艘太空船从一个太空站驶往任一太空站耗时均为 1。人们只能在太空船停靠太空站(或月球、地球)时上、下船。 初始时所有人全在地球上,太空船全在初始站。试设计一个算法,找出让所有人尽快地全部转移到月球上的运输方案。
1≤n≤13,1≤m≤20,1≤k≤50

用分层图解决
每一层代表一天,枚举答案,然后每一天的节点向下一天的节点连可运输人数的边。
跑最大流,直到总流量大于总人数。

[loj#6013] 负载平衡

公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最少搬运量可以使 n 个仓库的库存数量相同。搬运货物时,只能在相邻的仓库之间搬运。

这题感觉还是满经典的
我们首先可以计算出每个仓库的最终存储量,设ai=初始货物量-最终存储量
对于每个点,我们拆成两个点表示供应或需求
对于ai大于0的点,源点向其的供应点连容量为ai,费用为0的边
对于ai小于0的点,它的需求点向汇点连容量为-ai,费用为0的边

对于相邻的点,供应点分别向供应点及需求点连容量为INF,费用为1的边,代表运输。
跑最小费用最大流即可(这样汇点的所有入边都满流)

有没有想到WC2019 laofu讲的模拟费用流佬鼠进栋老鼠进洞问题?

[loj#6224] 深海机器人

潜艇内有多个深海机器人。潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动。 深海机器人在移动中还必须沿途采集海底生物标本,沿途生物标本由最先遇到它的深海机器人完成采集。 每条预定路径上的生物标本的价值是已知的,而且生物标本只能被采集一次。 本题限定深海机器人只能从其出发位置沿着向北或向东的方向移动,而且多个深海机器人可以在同一时间占据同一位置。 用一个 P×Q 网格表示深海机器人的可移动位置。西南角的坐标为 (0,0) ,东北角的坐标为 (Q,P) 。 给定每个深海机器人的出发位置和目标位置,以及每条网格边上生物标本的价值。 计算深海机器人的最优移动方案, 使深海机器人到达目的地后,采集到的生物标本的总价值最高。

由于每条边的价值只能有一次,考虑拆边,一条容量为1费用为-代价,一条容量为INF费用为0,跑最小费用最大流即可。

[loj#6014] 最长 k 可重区间集问题

题意:给定实直线 L 上 n 个开区间组成的集合 I,和一个正整数 k,试设计一个算法,从开区间集合 I 中选取出开区间集合 S⊆I ,使得在实直线 L 的任何一点 x,S 中包含点 x 的开区间个数不超过 k 。且
∑ z ∈ S ∣ z ∣ ∑z∈S|z| zSz达到最大。这样的集合 S 称为开区间集合 I 的最长 k 可重区间集。 ∑ z ∈ S ∣ z ∣ ∑z∈S|z| zSz 称为最长 k 可重区间集的长度。 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k 可重区间集的长度。

先将端点离散化
同一个位置只能有k个区间被选择,那么我们从源点向最左端点、每个端点向下个端点,最右端点向汇点均连容量为K,费用为0的边。而对于每个区间,左端点向右端点连容量为1,费用为-区间长度的边。
跑最小费用最大流即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值