[基本操作]网络流和最小割

CXM:网络流都是套路

然而我发现我并不会网络流,所以来搞一搞

应该不会放代码。。。有点懒

bzoj1066 蜥蜴

一个 $r imes c$ 的网格里,每个格有一个柱子,有些柱子上有蜥蜴,每个地方有一个跳跃半径,每次蜥蜴从柱子上跳开的时候,他起跳点的柱子高度 -1

不能有两个蜥蜴在同一个柱子上,柱子高度为 0 就是没柱子了,问最多能让多少蜥蜴跳到网格外面

sol:

外面建一个汇 T,源 S 向每个有蜥蜴的地方连边,能跳到 T 的向 T 连边,每个点向能跳到的点连边

然后发现,只有 S 出来的边有容量限制 1 (每个柱子上最开始只有一只蜥蜴),其余地方没有容量限制,每个点的流量限制是柱子高度,于是把柱子拆成两个点,中间连柱子高度的边就可以了

bzoj1070 修车

同一时刻有 N 位车主带着他们的爱车来到了汽车维修中心。维修中心共有 M 位技术人员,不同的技术人员对不同
的车进行维修所用的时间是不同的。现在需要安排这 M 位技术人员所维修的车及顺序,使得顾客平均等待的时间最
小。 说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。

sol:

平均时间转化一下就是时间和

考虑到对于每个技术人员,即时是同一个人,在不同时段用他,他需要的时间也是不同的,于是把 m 个人拆成 n*m 个人

S 向车连流量 1 费用 0

每个人向 T 连流量 1 费用 0 (同一时刻只能修一个车)

每个车向所有人连流量 1 费用为 【等待时间】的边

考虑等待时间怎么算,如果第 i 个人修的倒数第 k 个车是 j

那他的时间就是 $k imes time_{(i,j)}$

bzoj3876 支线剧情

一个有边权的有向图,每次你可以从 1 号点开始走,走到不能走为止,要把每条边都至少走过一次,求走过的最小总路程

sol:

每条边的费用为边权,下界为 1,上界没有,求一下最小费用可行流即可

bzoj2668 交换棋子

有一个 $n$ 行 $m$ 列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态。要求第 $i$ 行第 $j$ 列的格子只能参与 $m_{(i,j)}$ 次交换。

sol:

用 $f_a$ 表示 $lfloor frac{m_{(i,j)}}{2} floor$

用 $f_b$ 表示 $lceil frac{m_{(i,j)}}{2} ceil$

因为我懒得打字

这个题里有一个比较奇怪的东西叫做“参与交换”

如果一个棋子换到了 x 位置,之后没动过,x 位置经历了一次“参与交换”

如果一个棋子原来就在 x,走出去了,经历了一次

如果穿过 x 位置,经历了两次

这样的话建图就很明显了,可以把一个点拆成 3 个点 $(a,b,c)$

其中 $a->b$ 表示走到 x,$b -> c$ 表示从 x 走出去

一开始 S 向所有有棋子的点的 $b$ 连流量 1 费用 0,所有需要棋子的 $b$ 向 T 连流量 1 费用 0

对于每一对相邻的点 $(x,y)$ 可以建一条 $x_c$ 向 $y_a$ 的边 ,流量 inf 费用 0

对于一个点,如果它运出去了一个黑点,那就是 $a -> b$ 连一条 $f_b$,$b->c$ 连一条 $f_a$

对于一个点,如果它接收到了一个黑点,那就是 $a -> b$ 连一条 $f_a$,$b->c$ 连一条 $f_b$

对于一个点,如果它也没接收也没运,那就是 $a -> b$ 连一条 $f_a$,$b->c$ 连一条 $f_a$

bzoj1834 网络扩容

一个网络流的图,你可以花 $w_i$ 的代价将第 $i$ 条边的容量增加 1,求将最大流增加 $k$ 的最小费用

sol:

先做一遍最大流,把残量网络留着

然后思考,怎么加 $k$ 呢?显然是搞一个新源 $S'$ ,向 $S$ 连一个容量为 $k$ 的边

然后对于残量网络上每条边,新建一个跟它同向的边,流量 inf,费用 $w_i$,跑费用流就可以了

原文地址:https://www.cnblogs.com/Kong-Ruo/p/10118819.html