本篇题解将充分,全面地来解释建图的过程,以及其中的诸多细节。也欢迎各位指出其中不足。
拿到题后根据标签大体上可以判断出这是一个最小费用流。题目中有一段这样说道:
每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。
但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。
于是整理得,我们需要支持以下操作:
- 将脏餐巾以
f元/条
送到快洗部,过m天后,干净餐巾送回来使用 - 将脏餐巾以
s元/条
送到慢洗部,过n天后,干净餐巾送回来使用 - 延期送洗(可能会出现之后餐巾需求过少,并不需要所有餐巾的情况)
- 以
p元/条
购买新的餐巾
于是本题第一个难点就来了:如何处理脏餐巾和干净餐巾?
我们可以想到,每天开始的时候只有干净的餐巾可使用,每天结束的时候仅有脏的餐巾需要操作。于是将每天拆成两个点:起始点与结束点,分别处理不同时间段所需操作。
于是也可以想到:
- 送到快洗部属于结束点操作,连向
i+m
天后的起始点,费用为f(表示餐巾洗好了,可使用) - 送到慢洗部属于结束点操作,连向
i+n
天后的起始点,费用为s - 延期送洗属于结束点操作,连向
i+1
的起始点,不需费用。 - 购买新的餐巾属于起始点操作,目前并没有确定从哪连的,但费用为p。
以上操作流量均为$inf$
好了,到这里你有没有发现以上操作有什么共同点?
没错,他们都是连向起始点的有向边!
事实上,网络流24题的全称为“网络流与线性规划24题”,这也就告诉我们: 网络流的建图一定有顺序的,建的边一定是沿源点流向汇点,否则图就会不流通。
所以现在我们就弄明白了:我们应该将源点连接每天的结束点,而不是他们的起始点;起始点连向他们的汇点,容量为这天所需的餐巾数量,费用为0。
此外购买餐巾直接从源点购买即可。
之后跑一个裸的费用流即可。上我丑陋的代码:
1 |
|