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$,跑费用流就可以了