网络流24题(wll24)

How to build a map?

by Ciaxin

大体概括 网络流和线性规划24题 中23道的模型与建图思路,以下所有的题目的思路均会向图论方向靠近。



# 飞行员配对方案问题

[link] 每一架飞机需要有一名英国飞行员和一名外籍飞行员。即,英国飞行员 v 与外籍飞行员 u 进行匹配,算出其最大匹配,所以此题模型为二分图的最大匹配

对于二分图最大匹配而言,可由匈牙利算法最大流模型 解决。

在一个流网络中,由点 u 向点 v 的一条边 (u,v)f(u,v)=1 可以理解为一个匹配。

很显然由一名外籍飞行员 u 所连向的边 (u,v) 有多条,而最后的匹配仅会最多有一条,那就要保证从点 u 流出的流量为 1,才能保证最终只会连向一个点 v,那么建立源点 s,使得 s 到所有的点 u 的流量 f(s,u)=1

建立一条由点 v 流向汇点 t 的边,使完成的匹配流向汇点 t

S  1  ui  1  vi  1  T

最大流二分图的最大匹配,而流过的流量为 0 的边,就是其匹配。



# 太空飞行计划问题

[link]对于每个实验 Ei,都会需要一定数量的仪器 Ik,需要选出 d 个实验使其净收益最大化。此题模型为最大权闭合子图

但是我们不妨逆向思考,对于所有的实验 E,去掉 w 个实验使其净收益最大化,从而转化为 最小割模型。割掉的边即为去掉的某些实验。

同样建立一张流网络,实验 u 与仪器 v 间存在边 f(u,v)=+ 。(从而保证了被割去的边不会是该边)

由于进行每个实验将会获得为 p 的价值,所以用源点 S 连向点 u 流量为 p 的边。

将仪器点 v 连向汇点 T,使流量为 c 的边

这样由源点 S 到汇点 T 的增广路中存在 2 种情况:

  1. =,那么表示流量最终被源点 S 到点 u 的边 ei 限制,割边即为 ei,说明该实验的仪器费大于赞助费,不能使净收益最大化。
  2. ,那么表示限制的是花费仪器的边 ej,割边即为 ej,说明进行该实验存在收益。

若对于情况 1,用赞助费减去了流量,也就代表了没有进行这次实验;对于情况 2,赞助费减去流量为购买完仪器剩下的,即净收益

因为经过计算后的割边流量为 0,而源点 S,连接着所有的实验 u,所以那些与源点联通的实验就是可执行的实验啦。

反边:当我们发现存在一个仪器由两个实验才能完全购买时,可能存在其中一个实验用尽了赞助费,此时好像不与源点 S 联通,但存在反边可以由上述仪器连到该实验,使其联通。

可以理解为这条反边将第两个实验的赞助费部分给予了第一个实验。



# 最小路径覆盖问题

[link]最小路径覆盖,在一个有向无环图(DAG)中,选取最少的路径,使每一个点仅存在与一条路径中。特别的,长度可以为 0。(可以理解为单点)

对于一个简单路 P(a,b)P,如果它要再覆盖一个点 c(存在点可以被覆盖),那么此时的路径覆盖数将会减一,点 b 也就连向了点 c,好像是多了一条匹配(别问我为啥蒟蒻也不知道),但由于点 a 也连向点 b 连了一条边,但由于两个点 b 的含义不太一样(一个是流入的,一个是流出的),这里有个非常套路的套路——拆点!!(把每个点 x 拆作点 x1 与点 x2那这样就形成了两条由点 a2 到点 b1(作为流入),由点 b2(作为流出) 到点 c1 的两条边,也就真真正正的形成了两条匹配。

由于在图中减小了一条路径覆盖,就相当于增加了一条拆点后的匹配,那么可以微微地解释了:

=

那么我们把这个问题转换为了二分图最大匹配问题,从而可以用最大流模型求解。

注意:一个点 a 不可能存在点 a1 向点 a2 进行连边。因为不管是点 x1 还是点 x2 都只会形成最多一条匹配,所以其流量也为 1



# 魔术球问题

[link]对于柱子来讲,所有的柱子将要把所有的球放入,且每个球只能存在其中一个柱子上,就像是我们要找到一个满足规则 2 的图,使得可以被所有的 k 个柱子覆盖,此题为最小路径覆盖问题

“每次只能在某根柱子的最上面放球“,就像是原来最上面的球 b 与新球 c 产生了接触,原来的球又与下面的球 a 存在接触,就如 b 的下表面与 a 的上表面存在匹配,同 b 的上表面与 c 的下表面存在匹配。那么考虑拆点(把每个点 x 拆作点 x1 与点 x2

=可知,这个问题就变成求二分图的最大匹配,从而可以用最大流模型求解。

虽然这个题目与求最小路径覆盖数恰恰相反,但我们也可以选择枚举每个可行图(每次加入新的边),来判断是否满足给出的最小路径覆盖数即可。



# 圆桌问题

[link]题意为需要满足一个类似,由点 ui 连向 ri 个点 vj,每个点 vj,仅存在 cj 个入边的图。

如果当 rici 均为 1 的时候,这个图很明显的是一张二分图的最大匹配,当对 rici 不存在限制时,这就是一个二分图多重匹配问题

  1. 由于每个单位的代表可向所有的餐桌进行挑选,并且两个代表不能做一个餐桌,所有这每个单位 u 要向所有的餐桌 v 连接一条流量为 1 的边。
  2. 因为每个单位的代表仅有 ri 个,所以要限制从点 u 流出的流量为 ri,由此建立源点 S 连向点 u 流量为 ri 的边,从而限制了总的流量。‘
  3. 由于每个餐桌 v 将会被匹配多次,但由于餐桌的座位数量的限制,其最多为 ci 个,所以最终到达 v 的流量最多为 ci,这时利用汇点的作用,由点 v 连向汇点 T 一条流量为 ci 的边从而限制了其数量。

由于点 u 向点 v 的流量为 1,所以最终如果该流量为 0,意味着该单位 u 有代表到了餐桌 v,从而得到方案。



# 最长不下降子序列问题

[link]该题需要进行三种不同的询问。

1、计算最长不下降子序列的长度 s

使用动态规划解决该问题,设计状态 f(i) 为以 i 结尾的最长子序列的长度,其当前状态可由前 i1 个状态转移而来,即

f(i)=max{     1f(j)+1    (aiaj,i>j)

2、有多少个长度为 s 的不重复不下降子序列

由于每个点只能被选中一次,但并不每一个点都将会被选择一次,所以并不满足最小点覆盖的模型,但是此问题模型为最多不相交路径

在DP的过程中,可以发现 i 的状态是由一个满足的 j 转移过来的,就像是由 j 连向了 i 的一条边。

序列中的每个点 i 均可作为这个不下降序列的开端,而仅仅是 LIS=s 的点 j 可以作为这个序列的结尾。

由此可以由源点 S 到每个点 i,连接一条流量为 1 的边,由满足的点 j 连向汇点 T,连接一条流量为 1 的边,从而可以算出该长度序列的数量。

限制条件:点只能被选中一次。这个问题可以用 拆点 的方法将其两个点中间连接一条流量为 1 的边,得到其解决方法。

3、有多少个不同的长度为 s 的不下降子序列。

限制条件:除 x1,xn 的点只能被选中一次

因为限制点的方法是 拆点,那么关于 x1xn 的拆点的边的流量可以设置为 +,意味不受选择次数的限制。



# 试题库问题

[link]对于 m 道题的每一个类型 i 需要 k 个试题 j,换句话说,就是点 i 要和 kj 进行匹配,从而得到了该问题的模型 二分图多重匹配问题

(与 [圆桌问题](# # 圆桌问题) 相似)可以转换为最大流求解。

对于每个类型 i,可以与所有类型为 i 的试题连接一条流量为 1 的边,作为可以选择的情况(匹配)。

每个类型的题有数量为 k 的限制,所以由源点 S,连向每个类型 i 流量为 ki 的边。

又由每个试题 j 最多会被选择一次,所以连向汇点 T 处一条流量为 1 的边。

输出:同样的,匹配后的边即为流量变为 0 的边,输出即可。



# 方格取数问题

[link]在所有的数中,选取部分数(限制)的总和最大。

由于选取的数之间不存在什么联系,而仅有在四个方向的数才会有所制约,可以将理解为边。

一定不存在制约关系的一定是那些奇偶性相同的点,从此可以将其看做一个二分图,其此题为二分图点权最大独立集

首先我们不先去想选中那些数,而是去考虑将所有的数选中,再去删掉某些数。最终的答案就是所有的数的和减去被删掉的数。

在众多模型中,可能会想到 最小割问题。(割:删掉的某些数)

由于最小割是边,所以考虑拆点

但是由于转换成了网络流,存在源点与汇点,所以这个点权可以直接放在其之间(即,边权)。

而流过这些边就意味着选了这个点。若割为该边,即要删掉这个点。1

因为对点 xi,j 存在影响的是四个方向上的数,其中有边相连,但是这个边又不满足上述边 1的性质,所以将其流量设置为 +



# 餐巾计划问题

[link]该问题模型是线性规划网络优化。由于该题很明显存在费用,能参考想到用费用流求出。

初读该题目,我会想到的一种做法是:

  1. 将每一天拆作早上晚上两部分,由早上向晚上连接一条流量为 ri ,花费为 0 的边。
  2. 将源点看做购买处,早上可由此购买 + 条餐巾,费用为 p
  3. 对于快洗与慢洗,分别由第 i 天的晚上到 i+mi+n 的早上,流量为 + ,花费为 f,s
  4. i 天晚上,也可以连向第 i+1 天的晚上。
  5. 最后由汇点收集。

当然,这之中存在一些问题。【详细参考】

这里提供另一个建图的方法,

在这一天的干净餐巾来源,有三处:购买得到,慢洗得到,快洗得到。这一天脏的餐巾有三个去处:送去快洗,送去慢洗,扔给下一天处理

因为这一天需要 ri 个干净餐巾,但是到这一天的干净餐巾可能大于 ri 个,所以我们让每天恰好只对 ri 个餐巾单独进行结账。这样就限制了到这一天的干净餐巾的数量。

同样,如果仅仅用一个点无法完成这些操作。所以考虑将第 i 天拆成 “今天需要的餐巾(结账)” i1 与 “今天需要清洗的 ” i2

那么存在建图的方案,

  1. 连接一条由源点 S 到点 u1 的流量为 +,费用为 p 的边。(购买得到)
  2. 由点 u1 连向汇点 T 进行每一天的结账
  3. 连接一条由源点 S 到点 u2 的流量为 ri ,费用为 0 的边,以补充上一步流出的餐巾数。
  4. u2 作为 “需要清洗的” 步骤,连向三个地方:1、快洗后的一天 a1,慢洗后的一天b1,以及扔给下一天 (u+1)2

这种方案满足了每天恰好会花费一定数量的餐巾的限制。



# 软件补丁问题

[link]初读题目,由于一个部分仅会出现两种情况,正确 或者 错误。设 (1,0),表示第 1 个错误不存在(正确),第 2 个错误存在。那所以对于起初的软件可以表示为 (1,1,,1)

而对于一个补丁来说,可以由一个存在错误的状态转移到另一个存在错误的状态,同时花费时间。最终使这个状态全部为 (0,0,,0)

这很容易的让人想到最短路算法,没错这是一个最小转移代价的最短路题目,利用状态压缩简化。

如何建边

由于一个补丁的限制比较严苛,存在 B1,B2,F1,F2 四个状态。

设当前状态为 x,在使用位运算时,

x and B1 == B1 时,就表示 x 存在 B1 的所有错误。
x and B2 == 0 时,就表示 x 中并不存在 B2 的错误。

因为 x 可能存在不属于 F1 的错误,我们会清除掉这些错误,不妨让这个状态先拥有 F1 的所有状态(or),再进行异或xor操作清除。

新状态 y = ((x or F1) xor F1) xor F2;

将其分为 n+1 点,表示每一个错误状态,若这个补丁在该点是可用的,就将该点连到改变状态后的点,其边权为所用时间。



# 数字梯形问题

[link]这个题目被分为了三个部分,总之来讲还是一个最大权不相交路径问题,这条路径很明显是从最顶端到最底端的一条路径。

最长路可以对一条由起点到终点的路径求最大边权,而此题存在多条路径,由此可以想到最大费用最大流

  • 从梯形的顶至底的 m 条路径互不相交

路径不相交,即为点不相交,边不相交。对于边来说可以将流量设置为 1,费用为 0 的边。

而对于点来讲,权值是位于点上的,这时候其实就可以想到拆点的方法,将点权转移到边权,并将流量设置为 1

  • 而对于规则 2,3 来讲,仅仅是限制了点的流量边的流量

至于流网络的源点与汇点,必然是连在梯形的顶部所有的点,与底部所有的点上,流量均为 1,而费用均为 0 的边。而对于 m 条路径的限制,可由一个备用源点 S 连到原源点上,流量为 m,作为限流的作用。



# 运输问题

[link]由于零售商店需要来自仓库的货物 bi个,存在第 i 个仓库到第 j 个零售商店费用为 ci,j 。这种既存在费用限制,又存在数量限制的模型,很easy想到的就是网络费用流的模型

那么这个建图的方式也就呼之欲出了。

  • 由仓库可向零售商店连接一条流量为 +,费用为 ci,j 的边。

  • 共有 m 个仓库,每个需要 ai 个单位的货物,这种限制可由源点 S,进行限流,连接一条流量为 ai,费用为 0 的边。

  • 由汇点接收所有零售商店的货物,因为每个商店只需要 bi 个货物,所以由商店向汇点连接一条流量为 bi,费用为 0 的边。

然后就可以分别算出最大费用与最小费用了。



# 分配问题

[link]对于该题,共有 n 个工作分配与 n 个人做,而二者之间并不存在什么制约关系,最多是一个工作只能一个人做罢了。

那么这个模型就与二分图并无两样了,但其中有增加了边权的限制,这个模型就可以为二分图最佳匹配

由于网络流的最大流可以完美的解决二分图匹配问题(详见[飞行员配对方案问题](# # 飞行员配对方案问题)),而现在增加了边权的限制,就如同最大流模型上增加了费用,变成了费用最大流问题是相同的。

  • 由每个工作连向每个人一条流量为 1 (一条匹配),费用为 c 的边。
  • 由源点流向工作,由员工流向汇点,流量为 1,费用为 0 的边。

模型虽简单,却非常之经典。



# 负载平衡问题

[link]读到该题,一股思路涌现,—— 贪心!(最小代价供求问题)

该题的确可以用贪心解过,但是我们分析另一种思路,由于存在可以由相邻的仓库之间搬运,可以理解为相邻仓库存在连边

对于每个仓库,它开始拥有 ki 的货物,到最后会拥有 x 的货物。

由题意可知,1ni=1nki=x,即先前的货物的总量 = 最后货物的总量

  • 可以设立一个源点连向仓库 i,流量为 ki 的边,作为最先存在的货物,设立一个汇点,由仓库连向,流量为 x,表明最后这个仓库拥有 x 的货物,其费用均为 0
  • 而两两相邻的仓库之间存在边,其流量为 + ,费用为 1

这种建图的方式,可以完美的解决了最后使所有的仓库的数量相等的限制,也比较好理解。

当然存在另一种建图方式,

kix>0 的仓库,由源点 S 连入,流量为 kix,费用为 0
kix<0 的仓库,连入汇点 T,使其流量为 xki,费用为 0

这种方式,将个别仓库多的货物流向缺少货物的仓库,然后计算费用。



# 最长k可重区间集问题



# 星际转移问题

[link]由题意可以发现每个太空船的停靠周期可能是不相同的,所以无法一步进行完全转移。而太空船是到达月球的唯一方法,对于太空船,具有周期性(受时间影响)。

我们由时间作为条件,可以发现,当第 i 时到第 i+1 时:

  • 位于第 i 时第 j 号太空站的人员,可能会到达第 i+1 时第 j 号太空站。(即未进行移动)
  • 位于第 i 时第 j 号太空站的人员,可能会到达第 i+1 时第 k 号太空站,k 将会受到太空船的影响。

由此我们可以想到这可能是一张分层图最大流(人数),为网络判定

将源点 S 连向第 1 时间的地球上,流量为总人数。

我们枚举时间 t,将第 t1 时间的点连到 第 t 时间的点,会存在两种情况

  1. 不管有没有太空船可坐,都可以由点 ut1 连向点 ut,流量为 +
  2. 有太空船可坐,并由点 ut1 连向点 kt,流量为 hi(太空船人数限制)。

将汇点连到每个时间的月球上,判断其最终流量是否与总人数相等即可。

由于可能存在无法到达的情况,那这种情况是什么呢,即为所有的太空船都不会经过月球(可用并查集判断是否连通)。



# 孤岛营救问题

[link]由于这道题目涉及的知识面比较单一,可以easy地考虑到图论的想法。求出最短时间,那么很有可能是求解其最短路径

但是对于这个题目来说,具有门和钥匙的限制,是不好在同一张图中解决的。(当然你也可以使用搜索大法,将状态全部存起来)。

由于这个图受门和钥匙类型的限制,而这个限制比较小(p10),可以考虑 分层与状压

  • 将图分为 2p+1 层,每层的编号可以为该层的钥匙状态
  • 若在 x 层得到了新的钥匙,可以将其连到拥有新钥匙的第 y 层,边权为 0,位置不变。
  • 若拥有该门类型的钥匙,即可以通过。

我们由第 0 层,即没有任何钥匙的 (1,1) 位置跑最短路。

然后对于每一层的 (n,m) 位置取得一个最小值,即为答案。(也可以建立汇点直接连接,边权为 0)。



# 航空路线问题

[link]很明显,这个题已经告诉了你这个图长啥样,但是对于解决问题还是远远不够的。

从最西端城市出发,单向从西向东途经若干城市到达最东端城市,然后再单向从东向西飞回起点(可途经若干城市)。

对于这条限制(误导信息)的理解极为重要,其实不管对于从东到西,还是从西向东,总之是在两端城市间晃悠。

所以这个问题可以化为求两个最长不相交路径的长度,其中起点与终点相交(可重复2遍)。

因为点的经过次数的限制,那么可以考虑将这个点进行拆点操作,用最大流解决,使其流量为 1。(起点与终点为 2

最后对流量为 0 的边遍历两遍输出路径即可。

可能出现只能飞一遍的情况,(最终流量至于 1 )这种情况视为无解。



# 汽车加油行驶问题

[link]对于这样的具有限制的,且限制较小的最短路问题,可以考虑将这个限制变成新的一维,将原本的二维网格变为新的三维图形,即分层

对于该题,很明显的是一道最短路问题(BFS解决!!),由 (1,1) 到达 (n,n) 的最短花费(路径)。

但是我们想如果在 (x,y) 处建立了油库,那么就很难判断是否汽车到这里时是油库建立前还是之后了。

其中由于新增了油量的限制,所以可以把最短路的 disi,j 状态变为 disi,j,k 的三维。这样也就可以解决如果在一张图中如何不错误的建立油库,并加油的问题。

(当我们动规状态用不了时,也可以考虑多加几维\ww)

然后对于每个时期的状态就有了很好的转移,设 0wk

  • 对于油量 k0 时,汽车可沿 X 轴或 Y 轴进行移动。即

    (i,j,w)B(i1,j,w1)  (i,j1,w1)(i,j,w)0(i+1,j,w1)  (i,j+1,w1)

  • 但当遇到加油站时,汽车需要严格的进行加油操作,即

    (i,j,w)A(i,j,k)

  • 往往我们都会遇到油量变为 0 的情况,又因为题目告诉我们说油量为 0 时,必须建油库,所以对于任意的 (i,j,0) 状态都会存在一条连向 (i,j,k) 的边。

    (i,j,0)A+C(i,j,k)

既然分完层了,那么不管当流量是什么的时候( 0 也可以)只要到达 (n,n) 就算到达,那么对于所有的 (n,n,i) 的位置的最短路径就是答案,当然开始是从 (1,1,k) 开始的。



# 深海机器人问题

[link]由于该题是求最优移动问题,即线性规划问题。(当然这个题目不能用最短路做)

由于最短路只能跑一次(多跑几次也一样),也就是只能允许一个机器人跑一遍。

那么多跑几遍?也不是不行。因为最短路的图相当于一个流量只有 1 的流网络,既然这个题目扩大了其“流量”,那么也就可以使用费用流解决

由于已经给出了边权,那么对于每个边权只能有一个机器人接收,那么说,这条边的流量只能为 1

但是题目中有说过 而且多个深海机器人可以在同一时间占据同一位置。

(那么就让这条边流量变为 0 的时候,让流量变为 +,让费用变为 0

很显然用上面的方法是行不通的,而对于改变后的边,(它完全就是一条新的边嘛),我们在建图的时候直接加进去不就好了。

由于这两条边的起始、结束点相同,而费用不同,对于最大费用流来说,肯定是先跑最大费用的边。

所以,这样做是没问题的。



# 火星探险问题

[link]该题也是求最优移动问题,即线性规划问题。

与[深海机器人问题](# # 深海机器人问题)同属于一类题型,但是该题的思维难度会存在微微提升。

对于该题,由于每个石块的位置存在于点上,这对于流网络来讲,是极其不友好的。所以可以考虑将点进行拆点,点权边化。

而由于存在障碍物,即无法达到此处,也就是不存在该边。

最后对于方案的输出,不用多说,沿着流量为 0 的边深搜即可。



# 骑士共存问题

[link]该题目与[方格取数问题](# # 方格取数问题)2的题意极其相像,而做法也是大同小异。

同样每个点会与其周围 8 个点产生制约关系,同样可以将其理解为边。

我们通过手推一个 (5×5) 的矩阵(……)

可以发现同样是具有奇偶性相同的点将不会互斥,其中不会存在连边,就像是二分图。而我们的想法是求出最多的不存在连边的点,即二分图最大独立集

而二分图最大独立集与总点数和最大匹配的差相等,也可以用网络流的最小割解决2

对于最小割来讲,可以将奇偶性不同的点分为两部分,其中存在边相连(将流量设置为 +,防止被割掉的不会是点)。

其他由源点到一组点,由另一组点到汇点连边,流量为 1



# 最长k可重线段集问题



# 机器人路径规划问题

[link]这个题呀。。。

All code

posted @   Ciaxin  阅读(72)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示