BZOJ_1221_ [HNOI2001]_软件开发(最小费用流,网络流24题#10)
描述
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
8 2 1 6
Sample Output
HINT
Source
BZOJ_1221_ [HNOI2001]_软件开发(最小费用流,网络流24题#10)的更多相关文章
- Bashu2445 -- 【网络流24题-10】餐巾问题
2445 -- [网络流24题-10]餐巾问题 Description 一个餐厅在相继的n天里,每天需要用的餐巾数不尽相同.假设第i天需要ri块餐巾(i=1,2,…,n).餐厅可以购买新的餐巾,每块餐 ...
- [cogs461] [网络流24题#10] 餐巾 [网络流,最小费用最大流]
建图:从源点向第一层连边,第一层表示当天用掉多少餐巾,第二层表示当天需要多少餐巾,所以注意购买餐巾的边容量为无穷大,要从源点开始连向第二层的点,每天可能有剩余,在第一层内表示为流入第二天的节点.具体见 ...
- 【网络流24题】 No.12 软件补丁问题(最小转移代价 最短路)
[题意] T 公司发现其研制的一个软件中有 n 个错误, 随即为该软件发放了一批共 m 个补丁程序. 每一个补丁程序都有其特定的适用环境, 某个补丁只有在软件中包含某些错误而同时又不包含另一些错误时才 ...
- 【刷题】LOJ 6009 「网络流 24 题」软件补丁
题目描述 某公司发现其研制的一个软件中有 \(n\) 个错误,随即为该软件发放了一批共 \(m\) 个补丁程序.每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又不包含另一些 ...
- Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)
Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...
- [网络流24题] 洛谷P2761 软件补丁问题
题意:某公司发现其研制的一个软件中有 n个错误,随即为该软件发放了一批共 m 个补丁程序.对于每一个补丁 i ,都有 2 个与之相应的错误集合 B1(i)和 B2(i),使得仅当软件包含 B1(i)中 ...
- cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)
描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...
- 网络流基础&网络流24题
网络最大流 dinic+当前弧优化. const int N=10007,M=100007,inf=1e9; int s,t,head[N],ver[M],edge[M],Next[M],tot=1, ...
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...
随机推荐
- java中的异常处理机制_finally的使用
finally总结: finally代码块:定义一定执行的代码 通常用于关闭资源或者某些一定执行的代码 实例1:finally功能演示 class FuShuException extends Exc ...
- 07_XPath_01_入门
[工程截图] [person.xml] <?xml version="1.0" encoding="UTF-8"?> <students> ...
- 百练_4120 硬币(DP)
描述 宇航员Bob有一天来到火星上,他有收集硬币的习惯.于是他将火星上所有面值的硬币都收集起来了,一共有n种,每种只有一个:面值分别为a1,a2… an. Bob在机场看到了一个特别喜欢的礼物,想买来 ...
- [GeekBand] C++学习笔记(2)——BigThree、OOP
本篇笔记主要分为三个部分,第一部分是以String类为例的基于对象的编程,重点在于构造与析构.拷贝构造函数.拷贝赋值函数三个重要函数.这一部分与笔记(1)中的内容结合起来就是基于对象编程的主要内容.第 ...
- 安装FreeMind
Freemind 1.0.0 官方正式版下载地址:http://dl.pconline.com.cn/html_2/1/131/id=46751&pn=0.html 软件介绍: Freemin ...
- call_user_func
(PHP 4, PHP 5) call_user_func — 把第一个参数作为回调函数调用 mixed call_user_func ( callable $callback [, mixed $p ...
- mysqldump备份与还原mysql数据的实例
有关mysql数据库的备份与还原,我们一般用下面两种方式来处理:1.使用into outfile 和 load data infile导入导出备份数据 本文原始链接:http://www.jbxue. ...
- mysql存储过程讲解
1.数据库存储过程:简单滴说,存储过程就是存储在数据库中的一个程序. 2..数据库存储过程作用: 第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快. 第二:存储过程可以接受参数.输出参 ...
- MapReduce多表连接
多表关联 多表关联和单表关联类似,它也是通过对原始数据进行一定的处理,从其中挖掘出关心的信息.下面进入这个实例. 1 实例描述 输入是两个文件,一个代表工厂表,包含工厂名列和地址编号列:另一个代表地址 ...
- qt 5 数据库操作(mysql)
其实大家都知道,QT5以上的都自带了数据库驱动,所以呢,基本上可以直接使用,于是如果想知道怎么连接数据库,请参考这位大神写的.http://qtdebug.com/DB-AccessMySQL.htm ...