链接
题解
好题。这个题其实和最长 k k k可重区间集很类似,一个关键问题是怎么处理书架的容量,处理方式和区间集很类似,都是采用只增广至多 k k k次,每次增广单位流量来达到目的。处理好这个事情费用流的建模其实不难。为了使需求都被解决,把需求拆成两个点, i → i + n i \to i+n i→i+n连费用为 − I N F -INF −INF的边,使得其必选。每次增广解决一些需求,解决一个需求不是买书就是用前面的书,因此首先源点向每个点的入点连边,费用为买书的费用,其次每一个点的出点向后面点的入点连边,费用取决于两次需求的书是否相同。最后每个点的出点向汇点连边,费用为 0 0 0,表示一次增广可以在此结束(也就是把问题解决到这)。还有需要注意的是此处仅需要最小费用,没有最大流的事情,因此当 s p f a spfa spfa运行到 d i s t [ s t ] > 0 dist[st]>0 dist[st]>0时就要停止。