网络流24题 P1251 餐巾计划问题 拆点
题目描述
一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同。假设第 ii 天需要 r_iri块餐巾( i=1,2,...,N)。餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分;或者送到慢洗部,洗一块需 nn 天(n>mn>m),其费用为 ss 分(s<fs<f)。
每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。
试设计一个算法为餐厅合理地安排好 NN 天中餐巾使用计划,使总的花费最小。编程找出一个最佳餐巾使用计划。
我们知道,对于每一天,其实有两种状态:
一天开始状态,这个时候应该决定买多少新的餐巾数目,有没有从洗衣部送过来的东西
第一天结束,我们需要决定,是否需要对用过的餐巾进行封存,是否需要对把衣服送到两种洗衣部里面
那么很明显,一个点不能满足我们的需求,我们可以把点进行拆分,分成白天和晚上,对应有6种情况
我们需要从起点连接每个白天,流量限制,费用为p,代表这个的餐巾选择新购买的数目
从起点再连接每个点的晚上,流量限制为这一天所需的餐巾数目,代表这一天一定会产生这么多的用过的餐巾
从每天早上连接到汇点流量限制为这一天所需的餐巾数目,代表这白天一定会消耗这么多餐巾
由于可以把用过的餐巾存起来,我们把每个晚上的餐巾存到第二天从餐巾,流量为今天用的餐巾数目,费用为0
我们可以把餐巾送到快洗部,那么应该这天晚上的餐巾,送到洗完的那一天的早上,流量上限是INF(因为可能有以前存的衣服),费用为快洗部的费用
也可以把餐巾送到慢洗部,那么应该这天晚上的餐巾,送到洗完的那一天的早上,流量上限是INF(因为可能有以前存的衣服),费用为慢洗部的费用
注意拆点的话,可以把点拆成i和i+n
代码:
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<queue>
#define LL long long
using namespace std;
const LL N = 3e4+,M = 4e6+;
const LL INF = 0x3f3f3f3f;
LL ver[M],edge[M],cost[M],Next[M],head[N];
LL d[N],incf[N],pre[N],v[N],a[N];
LL n,k,tot,s,t,maxflow;
LL ans;
void add(LL x,LL y,LL z,LL c){
ver[++tot]=y,edge[tot]=z,cost[tot]=c;
Next[tot]=head[x],head[x]=tot; ver[++tot]=x,edge[tot]=,cost[tot]=-c;
Next[tot]=head[y],head[y]=tot;
}
bool spfa(){
queue<LL>q;
for (LL i=;i<=N;i++){
d[i]=INF;
}
memset(v,,sizeof(v));
q.push(s);
d[s]=;
v[s]=;
incf[s]=INF;
while(q.size()){
LL x=q.front();
v[x]=;
q.pop();
for (int i=head[x];i;i=Next[i]){
if(!edge[i])
continue;
int y=ver[i];
if (d[y]>d[x]+cost[i] && edge[i]>){
d[y]=d[x]+cost[i];
incf[y]=min(incf[x],edge[i]);
pre[y]=i;
if (!v[y])v[y]=,q.push(y);
}
}
}
if (d[t]==INF)return false;
return true;
}
void update(){
int x=t;
while(x!=s){
int i=pre[x];
edge[i]-=incf[t];
edge[i^]+=incf[t];
x=ver[i^];
}
maxflow+=incf[t];
ans+=d[t]*incf[t];
}
int main(){
LL q_day,q_w,s_day,s_w,p,
maxflow=;
ans=;
tot=;
scanf("%lld",&n);
s=*n+;
t=*n+;
for (LL i=;i<=n;i++){
scanf("%lld",&a[i]);
}
scanf("%lld%lld%lld%lld%lld",&p,&q_day,&q_w,&s_day,&s_w);
for (LL i=;i<=n;i++){
add(s,i,INF,p);
add(s,i+n,a[i],);
add(i,t,a[i],);
if (i<n)add(i+n,i+n+,INF,);
if (i+q_day<=n){
add(i+n,i+q_day,INF,q_w);
}
if (i+s_day<=n){
add(i+n,i+s_day,INF,s_w);
}
}
while(spfa())update();
printf("%lld\n",ans);
return ;
}
网络流24题 P1251 餐巾计划问题 拆点的更多相关文章
- Libre 6008 「网络流 24 题」餐巾计划  (网络流,最小费用最大流)
		
Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...
 - LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图
		
#6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
 - LOJ #6008. 「网络流 24 题」餐巾计划
		
#6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_iri 块餐巾.餐厅可以购买新的餐巾,每块餐 ...
 - [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划
		
[luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...
 - 【刷题】LOJ 6008 「网络流 24 题」餐巾计划
		
题目描述 一个餐厅在相继的 \(n\) 天里,每天需用的餐巾数不尽相同.假设第 \(i\) 天需要 \(r_i\) 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 \(P\) 分:或者把旧餐巾送到快洗 ...
 - LibreOJ #6008. 「网络流 24 题」餐巾计划
		
这道题其实我在刚学 OI 的时候就在一本通上看见过,还记得上面写着"新餐巾一次性买完"之类的话.当时还很稚嫩(现在也是),想了好久,根本想不出来. 学了网络流之后发现这道题的图也是 ...
 - Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
		
[网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...
 - P4480 「BJWC2018」「网络流与线性规划24题」餐巾计划问题
		
刷了n次用了奇淫技巧才拿到rk1,亥 这道题是网络流二十四题中「餐巾计划问题」的加强版. 于是怀着试一试的心情用费用流交了一发: 哇塞,过了9个点!(强烈谴责出题人用*造数据 下面是费用流解法简述: ...
 - 【hjmmm网络流24题补全计划】
		
本文食用方式 按ABC--分层叙述思路 可以看完一步有思路后自行思考 飞行员配对问题 题目链接 这可能是24题里最水的一道吧... 很显然分成两个集合 左外籍飞行员 右皇家飞行员 跑二分图最大匹配 输 ...
 
随机推荐
- Fusion Log
			
What is Fusion Log? Also known as the Fusion Log or Assembly Binding Log Viewer. This tool is instal ...
 - Java相关面试题总结+答案(一)
			
[Java基础] 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,即Java开发工具包,提供了Java 的开发环境和运行环境. JRE:Java Ru ...
 - 使用ASP.NET Core支持GraphQL -- 较为原始的方法
			
GraphQL简介 下面是GraphQL的定义: GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时. GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述 ...
 - 使用 Moq 测试.NET Core 应用 -- Mock 方法
			
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 本文介绍使用Moq来Mock方法. 使用的代码: https://git ...
 - Java泛型的重要目的:别让猫别站在狗队里
			
<Java编程思想>第四版足足用了75页来讲泛型——厚厚的一沓内容,很容易让人头大——但其实根本不用这么多,只需要一句话:我是一个泛型队列,狗可以站进来,猫也可以站进来,但最好不要既站猫, ...
 - LongLightUtils【保持屏幕常亮工具类】
			
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里只是简单记录下保持屏幕常亮工具类LongLightUtils的使用,具体请阅读参考资料<Android屏幕常亮,其实很简单 ...
 - KnockoutJS-绑定元素
			
工作变更,又走回了WPF,一个来月没有接触web开发了,之前的KnockoutJS却不想放弃,继续进行知识的巩固,下个月开始重新走回web开发之路,还是得用回一些习惯了的工具.本次开始接触各绑定元素功 ...
 - .NET移动开发,关于发布IOS的方法(本人亲身经历折腾很久终于成功)
			
前情提要:这位.NET程序员兄弟使用Smobiler开发了一个APP,尽管Smobiler云平台已经最大限度的简化了iOS应用的打包操作,但仍绕不开苹果公司强制要求的p12文件,p12文件需要开发者自 ...
 - Entity Framework (EF) Core工具创建一对多和多对多的关系
			
一. EntirtyFramework(EF)简介 EntirtyFramework框架是一个轻量级的可扩展版本的流行实体框架数据访问技术,微软官方提供的ORM工具让开发人员节省数据库访问的代码时间 ...
 - 原生 table css实现操作按钮固定右侧及底部滚动 IE不会卡死
			
需求的表格比较复杂(各种合并新增删除),elementUi的table组件无法满足需求,故而写了原生table,且与其他用了table组件的表格保持一致. 贴一下简单的代码,只实现操作按钮固定右侧以及 ...