2445 -- 【网络流24题-10】餐巾问题

Description

  一个餐厅在相继的n天里,每天需要用的餐巾数不尽相同。假设第i天需要ri块餐巾(i=1,2,…,n)。餐厅可以购买新的餐巾,每块餐巾的费用为p分;也可以把旧餐巾送到快洗部,洗一块需m天,其费用为f分;也可以把旧餐巾送到慢洗部,洗一块需要t天(t>m),其费用为s < f分。每天结束时,餐厅必须决定多少块脏的餐巾送到快洗部、多少块送到慢洗部以及多少块保存起来延期送洗。但是洗好的餐巾和购买的新餐巾之和,要满足第i天的需求量,并使总的花费最小。

Input

  输入文件的第一行6个正整数n,p,m,f,t,s。n是需要安排餐巾使用计划的天数;p是每块新餐巾的费用;m是快洗部洗一块餐巾需用天数;f是快洗部洗一块餐巾需要的费用;t是慢洗部洗一块餐巾需用天数;s是慢洗部洗一块餐巾需要的费用。接下来的n行是餐厅在相继的n天里,每天需用的餐巾数。 
  【规模】:1≤f,t,s≤60,1≤n≤1000)

Output

  文件输出只有一行为在这n天里餐厅需要使用餐巾的最小总花费。

Sample Input

  3 10 2 3 3 2
  5
  6
  7

Sample Output

  145
 
【建模分析】
这个问题的主要约束条件是每天的餐巾够用,而餐巾的来源可能是最新购买,也可能是前几天送洗,今天刚刚洗好的餐巾。每天用完的餐巾可以选择送到快洗部或慢洗部,或者留到下一天再处理。
经过分析可以把每天要用的和用完的分离开处理,建模后就是二分图。二分图X集合中顶点Xi表示第i天用完的餐巾,其数量为ri,所以从S向Xi连接容量为ri的边作为限制。Y集合中每个点Yi则是第i天需要的餐巾,数量为ri,与T连接的边容量作为限制。每天用完的餐巾可以选择留到下一天(Xi->Xi+1),不需要花费,送到快洗部(Xi->Yi+m),费用为f,送到慢洗部(Xi->Yi+n),费用为s。每天需要的餐巾除了刚刚洗好的餐巾,还可能是新购买的(S->Yi),费用为p。
 
【建模方法】
把每天分为二分图两个集合中的顶点Xi,Yi,建立附加源S汇T。
1、从S向每个Xi连一条容量为ri,费用为0的有向边。
2、从每个Yi向T连一条容量为ri,费用为0的有向边。
3、从S向每个Yi连一条容量为无穷大,费用为p的有向边。
4、从每个Xi向Xi+1(i+1<=N)连一条容量为无穷大,费用为0的有向边。
5、从每个Xi向Yi+m(i+m<=N)连一条容量为无穷大,费用为f的有向边。
6、从每个Xi向Yi+n(i+n<=N)连一条容量为无穷大,费用为s的有向边。
求网络最小费用最大流,费用流值就是要求的最小总花费。
 
贴代码~
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
const int maxn=,maxm=,inf=0x7fffffff;
int n,m,p,f,ss,tt,a,b,s,t,mincost,tot=,head[maxn],d[maxn],from[maxm*];
queue<int> q;
bool v[maxn];
struct node{
int from,go,v,c,next;
}e[maxm*];
inline int read(){
int x=;char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x;
}
inline void addedge(int x,int y,int v,int c){
e[++tot]=(node){x,y,v,c,head[x]};head[x]=tot;
e[++tot]=(node){y,x,,-c,head[y]};head[y]=tot;
}
bool spfa(){
for (int i=s;i<=t;i++) v[i]=,d[i]=inf;
q.push(s);d[s]=;v[s]=;
while (!q.empty()){
int x=q.front();q.pop();v[x]=;
for (int i=head[x],y;i;i=e[i].next){
if (e[i].v && d[x]+e[i].c<d[y=e[i].go]){
d[y]=d[x]+e[i].c;from[y]=i;
if (!v[y]) v[y]=,q.push(y);
}
}
}
return d[t]!=inf;
}
void mcf(){
mincost=;
while(spfa()){
int tmp=inf;
for (int i=from[t];i;i=from[e[i].from]) tmp=min(tmp,e[i].v);
mincost+=tmp*d[t];
for (int i=from[t];i;i=from[e[i].from]) e[i].v-=tmp,e[i^].v+=tmp;
}
}
int main(){
scanf("%d%d%d%d%d%d",&n,&p,&m,&f,&tt,&ss);
s=;t=n+n+;
for (int i=;i<=n;i++){
a=read();
addedge(s,i,a,);
addedge(n+i,t,a,);
addedge(s,n+i,inf,p);
if (i<n) addedge(i,i+,inf,);
if (i+m<=n) addedge(i,n+m+i,inf,f);
if (i+tt<=n) addedge(i,n+i+tt,inf,ss);
}
mcf();
printf("%d\n",mincost);
}

Bashu2445 -- 【网络流24题-10】餐巾问题的更多相关文章

  1. [cogs461] [网络流24题#10] 餐巾 [网络流,最小费用最大流]

    建图:从源点向第一层连边,第一层表示当天用掉多少餐巾,第二层表示当天需要多少餐巾,所以注意购买餐巾的边容量为无穷大,要从源点开始连向第二层的点,每天可能有剩余,在第一层内表示为流入第二天的节点.具体见 ...

  2. LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图

    #6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  3. Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)

    Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...

  4. LOJ #6008. 「网络流 24 题」餐巾计划

    #6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_ir​i​​ 块餐巾.餐厅可以购买新的餐巾,每块餐 ...

  5. [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划

    [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...

  6. BZOJ_1221_ [HNOI2001]_软件开发(最小费用流,网络流24题#10)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1221 n天,每天需要r个毛巾,用完以后可以洗,要么花fa洗a天,要么花fb洗b天,毛巾不够了可 ...

  7. 【刷题】LOJ 6008 「网络流 24 题」餐巾计划

    题目描述 一个餐厅在相继的 \(n\) 天里,每天需用的餐巾数不尽相同.假设第 \(i\) 天需要 \(r_i\) 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 \(P\) 分:或者把旧餐巾送到快洗 ...

  8. LibreOJ #6008. 「网络流 24 题」餐巾计划

    这道题其实我在刚学 OI 的时候就在一本通上看见过,还记得上面写着"新餐巾一次性买完"之类的话.当时还很稚嫩(现在也是),想了好久,根本想不出来. 学了网络流之后发现这道题的图也是 ...

  9. 网络流24题 P1251 餐巾计划问题 拆点

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...

随机推荐

  1. css实现文本超出部分省略号显示

    一般超出文本显示分为两种:单行超出文本和多行超出文本省略号显示,实现方式使用纯css实现: div { // 单行 white-space: nowrap; overflow: hidden; tex ...

  2. git保存用户名和密码

    git保存用户名和密码 简介:tortoiseGit(乌龟git)图形化了git,我们用起来很方便,但是我们拉取私有项目的时候,每次都要输入用户名和密码很麻烦,这里向大家介绍怎么避免多少输入 试验环境 ...

  3. javascript中正则表达式中的 match,exec,test,replace 之我理解

    这个正则 ($&) 的语法: https://msdn.microsoft.com/library/3k9c4a32(v=vs.94).aspx 在ECMAScript中对这几个的说明: ma ...

  4. A除以B

    1017 A除以B (20)(20 分) 本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中 ...

  5. python入门(七):字符串

    1.字符串类型: >>> s="早上好"               #str类型的字符串 >>> type(s) <class 'str ...

  6. python3之Django基础篇

    一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...

  7. CSS3实现投影效果

    Webkit引擎定义了-webkit-box-reflect属性,该属性能够实现投影效果,具体语法如下: -webkit-box-reflect: <direction> <offs ...

  8. wdk驱动开发的特点

    本文介绍WDK开发的一些特点.与应用层开发的差异性,不能混为一谈. 一.函数的调用点 在内核编程中,一个函数往往有多个调用点,而应用层中一个函数一般只在main里面有调用点.内核函数调用点一般在: 1 ...

  9. 数据库TCPIP协议开了,但还是远程连不上

    可能是因为开着防火墙 把防火墙关掉,或者参考下面的链接,在防火墙添加例外 https://zhidao.baidu.com/question/394026326542219285.html

  10. spring boot项目升级到2.0.1,提示java.lang.ClassNotFoundException: org.apache.log4j.Logger错误

    首先肯定是版本出现了一点兼容问题 所以我就进入项目,查看依赖树,cd到项目目录下,mvn dependency:tree 我看到我的项目原先是1.5.9和现在2.0.1的区别在于org.slf4j的依 ...