题目描述

一个餐厅在相继的 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 餐巾计划问题 拆点的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)

    [网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...

  8. P4480 「BJWC2018」「网络流与线性规划24题」餐巾计划问题

    刷了n次用了奇淫技巧才拿到rk1,亥 这道题是网络流二十四题中「餐巾计划问题」的加强版. 于是怀着试一试的心情用费用流交了一发: 哇塞,过了9个点!(强烈谴责出题人用*造数据 下面是费用流解法简述: ...

  9. 【hjmmm网络流24题补全计划】

    本文食用方式 按ABC--分层叙述思路 可以看完一步有思路后自行思考 飞行员配对问题 题目链接 这可能是24题里最水的一道吧... 很显然分成两个集合 左外籍飞行员 右皇家飞行员 跑二分图最大匹配 输 ...

随机推荐

  1. MySQL 文章目录

    MySQL系列: MySQL CREATE TABLE语法 MySQL 复制表结构 MySQL 对比数据库表结构 MySQL 处理插入过程中的主键唯一键重复值办法 MySQL 启动原理剖析 MySQL ...

  2. WebSocket整合SSM(Spring,Struts2,Maven)

    一.WebSocket与HTTP长轮询 WebSocket 属于HTML5 规范的一部分,提供的一种在单个 TCP 连接上进行全双工通讯的协议.允许服务端主动向客户端推送数据.在 WebSocket ...

  3. Flarum轻量级论坛的安装

    论坛作为互联网中的远古产物,经历了如QQ群.社区和贴吧等新兴社交工具的冲击,依然能够存在,肯定是有着不可替代的用处,像吾爱.远景等论坛依旧火热.一些博客主也喜欢自己搭建一个论坛作为用户聚集之地. 之前 ...

  4. PHP全栈学习笔记6

    php能做什么,它是运行在服务器端的,web网站大部分数据都是存储在服务器上的,PHP就是用来处理这些存储在服务器的数据.跨平台,服务器可以是多种平台上的服务器,脚本语言,免费. wampserver ...

  5. ajax data属性传值的方式总结

    在和后台同事对接口的时候,有一个小问题一直困扰着我.那就是用ajax请求后台接口数据,需要用data属性传值的时候,data属性传值的方式感觉没有统一用一种方式. 后来仔细想想,其实哪种方式都可以,主 ...

  6. JavaScript 执行机制

    一.宏任务与微任务 macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTi ...

  7. pip安装python库时使用国内镜像资源加速下载过程

    pip默认安装包是从网站https://pypi.org/simple下载,我们可以将其改成国内的镜像网站,加速下载过程,下面以安装numpy库为例: pip install -i https://p ...

  8. 探索js原型链和vue构造函数中的奥妙

    这篇文章首先会讲到原型链以及原型链的一些概念,然后会通过分析vue的源码,来看一下vue的构造函数是如何被创建的,now we go! 一.什么是原型链? 简单回顾下构造函数,原型和实例的关系:   ...

  9. 几个常用的vscode插件

    1.Vetur 可以对.vue文件格式做语法高亮,开发基于Vue项目的标配插件 2.Power Mode 在写代码时出现如烟花.粒子.火焰之类的效果,增加写代码的乐趣 3.Chinese (simpl ...

  10. 全文检索-Elasticsearch (四) elasticsearch.net 客户端

    本篇摘自elasticsearch.net search入门使用指南中文版(翻译) 原文:http://edu.dmeiyang.com/book/nestusing.html elasticsear ...