描述


http://www.lydsy.com/JudgeOnline/problem.php?id=1221

n天,每天需要r个毛巾,用完以后可以洗,要么花fa洗a天,要么花fb洗b天,毛巾不够了可以话f买一个,问最少需要多少钱.

分析


把每天拆成两个点:x[i]表示第i天的脏毛巾,y[i]表示第i天要用的毛巾.

1.s向x[i]连弧,容量为r[i],花费为0,表示每天会用脏r[i]条毛巾.

2.x[i]向x[i+1]连弧(注意边界),容量为INF,花费为0,表示把第i天的脏毛巾搁置到第i+1天(由于可能连续搁置多日,所以可能不只r[i]个).

3.x[i]向y[i+a+1]连弧(注意边界),容量为INF,花费为fa,表示把第i天的脏毛巾拿去进行a洗.

4.x[i]向x[i+b+1]连弧(注意边界),容量为INF,花费为fb,同上.

5.s向y[i]连弧,容量为INF(其实可以是r[i],因为y只流向t,最多流r[i]),花费为f,表示新买毛巾.

6.y[i]向t连弧,容量为r[i],花费为0,表示第i天用了r[i]个毛巾.

注意:

1.用^运算的时候(0,1)是一组,(2,3)是一组这样子,所以从偶数开始,又不能从0开始,所以从2开始.(debug了好久...)

p.s.

1.第一次手写队列,没问题,没想到是手写的链表错了..........

2.网络流24题?以后每天做一道试试吧.

 #include <bits/stdc++.h>
using namespace std; const int maxn=+,INF=<<;
int cnt=;
int head[maxn<<],q[maxn<<],d[maxn<<],p[maxn<<];
bool vis[maxn<<]; struct edge{
int from,to,cap,cost,next;
edge(){}
edge(int from,int to,int cap,int cost,int next):from(from),to(to),cap(cap),cost(cost),next(next){}
}g[maxn*maxn];
void add_edge(int u,int v,int cap,int cost){
g[++cnt]=edge(u,v,cap,cost,head[u]); head[u]=cnt;
g[++cnt]=edge(v,u,,-cost,head[v]); head[v]=cnt;
}
bool spfa(int s,int t){
for(int i=s;i<=t;i++) d[i]=INF, vis[i]=false;
d[s]=; vis[s]=true;
int front=,tail=;
q[tail++]=s;
while(front!=tail){
int u=q[front++]; if(front==) front=;
vis[u]=false;
for(int i=head[u];i;i=g[i].next) if(g[i].cap&&d[g[i].to]>d[u]+g[i].cost){
d[g[i].to]=d[u]+g[i].cost;
p[g[i].to]=i;
if(!vis[g[i].to]){
vis[g[i].to]=true;
q[tail++]=g[i].to; if(tail==) tail=;
}
}
}
return d[t]!=INF;
}
int min_cost(int s,int t){
int ret=,f;
while(spfa(s,t)){
f=INF;
for(int u=t;u!=s;u=g[p[u]].from) f=min(f,g[p[u]].cap);
for(int u=t;u!=s;u=g[p[u]].from) g[p[u]].cap-=f, g[p[u]^].cap+=f;
ret+=d[t]*f;
}
return ret;
}
int main(){
int n,a,b,f,fa,fb;
scanf("%d%d%d%d%d%d",&n,&a,&b,&f,&fa,&fb);
int s=,t=(n<<)+;
for(int i=;i<=n;i++){
if(i+<=n) add_edge(i,i+,INF,);
if(i+a+<=n) add_edge(i,n+i+a+,INF,fa);
if(i+b+<=n) add_edge(i,n+i+b+,INF,fb);
add_edge(,n+i,INF,f);
}
for(int i=;i<=n;i++){
int r; scanf("%d",&r);
add_edge(s,i,r,);
add_edge(n+i,t,r,);
}
printf("%d\n",min_cost(s,t));
return ;
}

1221: [HNOI2001] 软件开发

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1236  Solved: 685
[Submit][Status][Discuss]

Description


软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其
中一项服务就是要为每个开发人员每天提供一块消毒毛巾,这种消毒毛巾使用一天后必须再做消毒处理后才能使用。消毒方式有两种,A种方式的消毒需要a天时
间,B种方式的消毒需要b天(b>a),A种消毒方式的费用为每块毛巾fA,
B种消毒方式的费用为每块毛巾fB,而买一块新毛巾的费用为f(新毛巾是已消毒的,当天可以使用);而且f>fA>fB。公司经理正在规划在
这n天中,每天买多少块新毛巾、每天送多少块毛巾进行A种消毒和每天送多少块毛巾进行B种消毒。当然,公司经理希望费用最低。你的任务就是:为该软件公司
计划每天买多少块毛巾、每天多少块毛巾进行A种消毒和多少毛巾进行B种消毒,使公司在这项n天的软件开发中,提供毛巾服务的总费用最低。

Input

第1行为n,a,b,f,fA,fB. 第2行为n1,n2,……,nn. (注:1≤f,fA,fB≤60,1≤n≤1000)

Output

最少费用

Sample Input

4 1 2 3 2 1
8 2 1 6

Sample Output

38

HINT

Source

BZOJ_1221_ [HNOI2001]_软件开发(最小费用流,网络流24题#10)的更多相关文章

  1. Bashu2445 -- 【网络流24题-10】餐巾问题

    2445 -- [网络流24题-10]餐巾问题 Description 一个餐厅在相继的n天里,每天需要用的餐巾数不尽相同.假设第i天需要ri块餐巾(i=1,2,…,n).餐厅可以购买新的餐巾,每块餐 ...

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

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

  3. 【网络流24题】 No.12 软件补丁问题(最小转移代价 最短路)

    [题意] T 公司发现其研制的一个软件中有 n 个错误, 随即为该软件发放了一批共 m 个补丁程序. 每一个补丁程序都有其特定的适用环境, 某个补丁只有在软件中包含某些错误而同时又不包含另一些错误时才 ...

  4. 【刷题】LOJ 6009 「网络流 24 题」软件补丁

    题目描述 某公司发现其研制的一个软件中有 \(n\) 个错误,随即为该软件发放了一批共 \(m\) 个补丁程序.每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又不包含另一些 ...

  5. Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)

    Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...

  6. [网络流24题] 洛谷P2761 软件补丁问题

    题意:某公司发现其研制的一个软件中有 n个错误,随即为该软件发放了一批共 m 个补丁程序.对于每一个补丁 i ,都有 2 个与之相应的错误集合 B1(i)和 B2(i),使得仅当软件包含 B1(i)中 ...

  7. cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)

    描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...

  8. 网络流基础&网络流24题

    网络最大流 dinic+当前弧优化. const int N=10007,M=100007,inf=1e9; int s,t,head[N],ver[M],edge[M],Next[M],tot=1, ...

  9. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

随机推荐

  1. How to: Extract files from a compiled setup.exe created by Inno setup

    Use innounp.exe to unpack setup.exe created by using Inno setup: for example, unpack all the files w ...

  2. 九度OJ 1442 A sequence of numbers

    题目地址:http://ac.jobdu.com/problem.php?pid=1442 题目描述: Xinlv wrote some sequences on the paper a long t ...

  3. JS实现div块的拖放,调换位置

    主要是HTML5 的拖放(Drag 和 Drop) 例子(不需要对div设置ID): <!DOCTYPE HTML> <html> <head> <scrip ...

  4. JDK1.8 HashMap中put源码分析

    一.存储结构      在JDK1.8之前,HashMap采用桶+链表实现,本质就是采用数组+单向链表组合型的数据结构.它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置.Hash ...

  5. EF 的 霸气配置

    通过EF 作为操作数据库的工具有一段时间了,也做了几个相对不大的项目,慢慢的也对EF的使用摸索出来了一些规则,虽然说不是技术难点,但是,我说的是但是,能够提高我们开发效率的棉花糖有时我们还是必须要吃的 ...

  6. JS判断是否微信浏览器

    JS判断是否微信浏览器 function isWeixinBrowser(){ var ua = navigator.userAgent.toLowerCase(); return (/microme ...

  7. func_get_args的使用

    func_get_args是获取方法中参数的数组,返回的是一个数组,与func_num_args搭配使用:func_num_args一般写在方法中,用于计数:使用方法如下:function foo($ ...

  8. WinForm小小应用

    制作日历计划任务 private void BeginTask() { Thread th = new Thread(//建立线程 (() =>//使用Lambda表达式 { while (tr ...

  9. Sybase数据库异常紧急恢复

    现象:Error 926  Severity Level 14  Error Message Text  Database 'xx' cannot be opened - it has been ma ...

  10. Class.forName()的作用与使用总结(转载)

    转载自:Class.forName()的作用与使用总结 1.Class类简介: Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识.这项信息纪录了每个对象所属的类.虚拟机 ...