[网络流24题]餐巾(cogs 461)
【问题描述】
一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,…,N)。餐厅可以从三种途径获得餐巾。
(1)购买新的餐巾,每块需p分;
(2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f<p)。如m=l时,第一天送到快洗部的餐巾第二天就可以使用了,送慢洗的情况也如此。
(3)把餐巾送到慢洗部,洗一块需n天(n>m),费用需s分(s<f)。
在每天结束时,餐厅必须决定多少块用过的餐巾送到快洗部,多少块送慢洗部。在每天开始时,餐厅必须决定是否购买新餐巾及多少,使洗好的和新购的餐巾之和满足当天的需求量Ri,并使N天总的费用最小。
【输入】
输入文件共 3 行,第 1 行为总天数;第 2 行为每天所需的餐巾块数;第 3 行为每块餐巾的新购费用 p ,快洗所需天数 m ,快洗所需费用 f ,慢洗所需天数 n ,慢洗所需费用 s 。
【输出】
一行,最小的费用
【样例】
napkin.in
3
3 2 4
10 1 6 2 3
napkin.out
64
【数据规模】
n<=200,Ri<=50
/*
这个题很神奇的是把一个点拆成旧餐巾和新餐巾(不知道那些dalao怎么想出来的)。
然后建模跑最小费用最大流:
由S向Xi连一条容量为ri,费用为0的边,代表每天会产生ri块旧餐巾;
由Yi向T连一条容量为ri,费用为0的边,代表每天需要ri块新餐巾(此边一定要填满);
由Xi向Xi+1连一条容量为inf,费用为0的边,代表这些旧餐巾留到下一天处理;
由Xi到Yi+m(Xi+m<=day)连一条容量为inf,费用为f的边,代表快洗;
由Xi到Yi+n(Xi+n<=day)连一条容量为inf,费用为s的边,代表慢洗;
由S到Yi连一条容量为inf,费用为p的边,代表买新的。
PS:更新奇的是这样跑可以保证由Yi向T的边一定会填满。
*/
#include<cstdio>
#include<iostream>
#define N 410
#define M 100010
#define inf 1000000000
using namespace std;
int head[N],dis[N],r[N],q[N*],inq[N],fa[N],day,p,m,f,n,s,cnt=,S,T,ans;
struct node{
int u,v,pre,f,w;
};node e[M];
void add(int u,int v,int f,int w){
e[++cnt].u=u;e[cnt].v=v;e[cnt].f=f;e[cnt].w=w;e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].u=v;e[cnt].v=u;e[cnt].f=;e[cnt].w=-w;e[cnt].pre=head[v];head[v]=cnt;
}
bool spfa(){
for(int i=;i<=T;i++)dis[i]=inf;
int h=,t=;dis[S]=;q[]=S;inq[S]=;
while(h<t){
int now=q[++h];inq[now]=;
for(int i=head[now];i;i=e[i].pre){
int v=e[i].v;
if(e[i].f&&dis[v]>dis[now]+e[i].w){
dis[v]=dis[now]+e[i].w;
fa[v]=i;
if(!inq[v]){
inq[v]=;
q[++t]=v;
}
}
}
}
return dis[T]!=inf;
}
void up_data(){
int i=fa[T],x=inf;
while(i!=S){
x=min(x,e[i].f);
i=fa[e[i].u];
}
i=fa[T];
while(i!=S){
e[i].f-=x;
e[i^].f+=x;
ans+=x*e[i].w;
i=fa[e[i].u];
}
}
int main(){
freopen("napkin.in","r",stdin);
freopen("napkin.out","w",stdout);
scanf("%d",&day);
for(int i=;i<=day;i++)scanf("%d",&r[i]);
scanf("%d%d%d%d%d",&p,&m,&f,&n,&s);
S=;T=*day+;
for(int i=;i<=day;i++){
add(S,i,r[i],);
add(i+day,T,r[i],);
if(i+<=day)add(i,i+,inf,);
if(i+m<=day)add(i,i+m+day,inf,f);
if(i+n<=day)add(i,i+n+day,inf,s);
add(S,i+day,inf,p);
}
while(spfa())up_data();
printf("%d",ans);
return ;
}
[网络流24题]餐巾(cogs 461)的更多相关文章
- Cogs 461. [网络流24题] 餐巾(费用流)
[网络流24题] 餐巾 ★★★ 输入文件:napkin.in 输出文件:napkin.out 简单对比 时间限制:5 s 内存限制:128 MB [问题描述] 一个餐厅在相继的N天里,第i天需要Ri块 ...
- 【COGS 461】[网络流24题] 餐巾 最小费用最大流
既然是最小费用最大流我们就用最大流来限制其一定能把每天跑满,那么把每个表示天的点向T连流量为其所需餐巾,费用为0的边,然后又与每天的餐巾对于买是无限制的因此从S向每个表示天的点连流量为INF,费用为一 ...
- 网络流24题 餐巾计划(DCOJ8008)
题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_iri 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分:或者把旧餐巾送到快 ...
- CGOS461 [网络流24题] 餐巾(最小费用最大流)
题目这么说的: 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,…,N).餐厅可以从三种途径获得餐巾. 购买新的餐巾,每块需p分: 把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f< ...
- 【zkw费用流】[网络流24题]餐巾计划问题
题目描述 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f ...
- COGS461. [网络流24题] 餐巾
[问题描述] 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,…,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分 ...
- 【Codevs1237&网络流24题餐巾计划】(费用流)
题意:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同. 假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分: 或者把旧餐巾送到快洗部,洗一块需 ...
- Bashu2445 -- 【网络流24题-10】餐巾问题
2445 -- [网络流24题-10]餐巾问题 Description 一个餐厅在相继的n天里,每天需要用的餐巾数不尽相同.假设第i天需要ri块餐巾(i=1,2,…,n).餐厅可以购买新的餐巾,每块餐 ...
- LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图
#6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
随机推荐
- 实体ip 虚拟ip 固定ip 动态ip
实体 IP:在网络的世界里,为了要辨识每一部计算机的位置,因此有了计算机 IP 位址的定义.一个 IP 就好似一个门牌!例如,你要去微软的网站的话,就要去『 207.46.197.101 』这个 IP ...
- ajax异步提交数据动态更改select选项
<!DOCTYPE html> <html> <head> <title></title> <script src="../ ...
- spring ioc原理
最近,买了本Spring入门书:spring In Action .大致浏览了下感觉还不错.就是入门了点.Manning的书还是不错的,我虽然不像哪些只看Manning书的人那样专注于Manning, ...
- [codevs1027]姓名与ID
[codevs1027]姓名与ID 试题描述 有N个人,各自有一个姓名和ID(别名).每个人的姓名和ID都没有重复.这些人依次进入一间房间,然后可能会离开.过程中可以得到一些信息,告知在房间里的某个人 ...
- VSSより、指定したファイルを取得するマクロ(パス入り)
Option Explicit'VSSのiniファイルの場所Private SRCSAFE_INI As String'VSS接続のユーザIDPrivate USER_ID As String'VSS ...
- Laravel 5.1 文档攻略 —— Eloquent Collection
简介 像all()和get(),还有一些处理模型关系这种会返回多条数据的方法,在Eloquent里面会返回一个collection对象集合(对象装在对象里),而不是像DQB的数组结果集合(对象装在数组 ...
- Android碎片(Fragment)简述
碎片(Fragment)是一种可以嵌入活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因此碎片在平板上的应用非常广泛. 你可以将碎片理解成一个迷你型的活动,水平同样可能包含布局,同样都 ...
- 思科 vlan 相关操作
添加或者修改VLAN Switch(config)# vlan vlan-id Switch(config-vlan)# name vlan-name 删除VLAN Switch(config)# n ...
- Java web中为什么要用Service接口和DAO接口?
面向接口:依赖倒转原理----使用service接口的原因是为了让表示层不依赖于业务层的具体实现,使用dao接口的原理也是如此,而且便于spring ioc容器,当修改dao层,时不需要修改servi ...
- python 端口扫描仪
思路:使用socket进行连接测试,即客户端连接服务器. 核心代码如下: from socket import * def try_port(ip,port,protocol = SOCK_STREA ...