一道最小费用最大流的模板题,对于最小费用最大流,比较简单的做法是不断地在残量网络上跑SPFA,每次找到从源点到汇点花费最小的路径,并且跑完这条路径上的流量,直到从源点无法到达汇点为止。
这道题的建图比较有意思。我们设第i天需要nd[i]块餐巾,购买一块餐巾的费用是newp,慢洗需要sloc天,花费是slop;快洗需要fstc天,花费是fstp。首先将n天拆点,设xi为第i天开始时拥有的餐巾数量,yi为第i天结束后用过的餐巾数量。则我们从源点向每个xi连一条费用为0,流量为nd[i]的边来限制,同时从每个yi都向汇点连一条流量为nd[i],费用为0的边进行限制。
接下来对于每条规则进行限制:
- 来源为新购买的餐巾:从源点向每个yi连一条流量为无穷,花费为newp的边;
- 用过的餐巾送到慢洗部:从xi向y(i+sloc)连一条流量为无穷,花费为slop的边;
- 用过的餐巾送到快洗部:从xi向y(i+fstc)连一条流量为无穷,花费为fstp的边;
- 用过的餐巾留到下一天再处理:从xi向x(i+1)连一条流量为无穷,花费为0的边。
这样建图之后,能够保证最大流为,最小花费即为最大流的最小费用。
对于反边,要注意流量为0,花费为相反数。
代码
|
|