【LG-P1251】餐巾计划问题
传送门:P1251 餐巾计划问题
一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同。假设第 i 天需要 ri 块餐巾(i = 1, 2, ..., N)。餐厅可以购买新的餐巾,每块餐巾的费用为 p 分;或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分;或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s 分(s<f)。每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。
Solution\mathfrak{Solution}Solution
费用流 + 拆点
此题的建图可以说是非常新奇了。
已知:每天早上要用或收到新的餐巾,晚上要处理脏餐巾。明显每天的早上和晚上操作不同,所以要将每天拆成两个点,早上和晚上。
- 让源点连向晚上,收到待处理脏餐巾,流量为当天使用餐巾数,费用为 0。
- 让早上连向汇点,提供当前所需净餐巾,流量为当天使用餐巾数,费用为 0。显然,当这条路流量满时,代表当天所需餐巾量已达到。
这样连接,保证了网络的联通性,同时可以在此基础上使用费用流解决此问题。
然后再来看其余四种操作:
- 快洗:因为是晚上送去白天收到使用,所以自当天晚上连向 mmm 天后的早上, 费用为 fff,流量为 infinfinf。
- 慢洗:同理。
- 残留餐巾:从今天晚上留到明天晚上,所以自当天晚上连向明天晚上,费用为 0,流量为 infinfinf。
- 购买新餐巾:自源点连向早上,费用为 ppp,流量为 infinfinf。
综上,易知当这个网络自源点向汇点连通时,满足每一天早上都有当天所需所有餐巾。所以在此基础上可以去跑费用流了。
Code+Notes\mathfrak{Code + Notes}Code+Notes
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;#define int long long
#define inf 2147483647
#define rep(i, a, b) for(int i = a; i <= b; ++i)
const int maxn = 5005;
const int maxm = 2e5 + 5;
int n, p, m, ss, f, q, s, t;
bool vis[maxn];
int incf[maxn], dis[maxn], pre[maxn], mxfl, mxcs;
int cnt = 1, hd[maxn];
struct node{int to, nxt, flw, cst;
}e[maxm];inline void add(int u, int v, int w, int c)
{e[++cnt].to = v;e[cnt].nxt = hd[u], e[cnt].flw = w, e[cnt].cst = c;hd[u] = cnt;e[++cnt].to = u;e[cnt].nxt = hd[v], e[cnt].flw = 0, e[cnt].cst = -c;hd[v] = cnt;
}inline bool spfa()
{queue <int> q;memset(dis, 0x3f, sizeof dis);memset(vis, 0, sizeof vis);q.push(s), vis[s] = 1, dis[s] = 0, incf[s] = 2147483647;while(!q.empty()){int u = q.front();q.pop(), vis[u] = 0;for(int i = hd[u], v; i; i = e[i].nxt){if(!e[i].flw) continue;//注意不要漏掉 if(dis[v = e[i].to] > dis[u] + e[i].cst){dis[v] = dis[u] + e[i].cst;//记录一路上的费用 incf[v] = min(incf[u], e[i].flw);//最终能流到 v点的流量 pre[v] = i;//记录路径 if(!vis[v]) vis[v] = 1, q.push(v);}}}if(dis[t] != dis[n * 2 + 2]) return true;return false;
}inline void mcmf()
{while(spfa())//多次增广 {mxfl += incf[t];mxcs += incf[t] * dis[t];int x = t, i;while(x != s){i = pre[x];e[i].flw -= incf[t], e[i ^ 1].flw += incf[t];x = e[i ^ 1].to;}}
}signed main()
{/*1.自源点向每天晚上连边 费用为 0 流量为 xi(当天使用餐巾数) 2.自每天早上向汇点连边 费用为 0 流量为 xi(当天所需餐巾数) 3.晚上快洗到若干天后早上 费用为 f 流量为 inf 4.同3,慢洗 费用为 s 流量为 inf 5.自源点向每天早上连边,买新的餐巾 费用为 p 流量为 inf 6.残留餐巾,将今天晚上向明天晚上连边 费用为 0 流量为 inf */ scanf("%lld", &n);s = 0, t = n * 2 + 1;rep(i, 1, n){int x;scanf("%lld", &x);add(s, n + i, x, 0)/*建图 1*/, add(i, t, x, 0)/*建图 2*/;}scanf("%lld %lld %lld %lld %lld", &p, &m, &f, &q, &ss);rep(i, 1, n){add(s, i, inf, p);//建图 5 if(i < n) add(n + i, n + i + 1, inf, 0);//建图 6 if(i + m <= n) add(n + i, i + m, inf, f);//建图 3 if(i + q <= n) add(n + i, i + q, inf, ss);//建图 4 }mcmf();printf("%lld\n", mxcs);return 0;
}
——End\mathfrak{End}End——
【LG-P1251】餐巾计划问题相关推荐
- 洛谷P1251 餐巾计划问题 无汇源最小费用流
题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...
- 费用流 ---- P1251 餐巾计划问题[拆点](网络流24题)
题目链接 题目大意: 解题思路 将脏餐巾以f元/条送到快洗部,过m天后,干净餐巾送回来使用 将脏餐巾以s元/条送到慢洗部,过n天后,干净餐巾送回来使用 延期送洗(可能会出现之后餐巾需求过少,并不需要所 ...
- 洛谷 - P1251 餐巾计划问题(最小费用最大流+思维建边)
题目链接:点击查看 题目大意:给出n天每天所需要的新餐巾的数量,现在有多种方式可以获得新餐巾,问如何运营能使花费最少: 直接购买,花费为cost 将脏餐巾送到快洗部,需要洗t1天,花费为c1 将脏餐巾 ...
- P1251 餐巾计划问题 费用流
https://www.luogu.org/problemnew/show/P1251 题意 有一家酒店,酒店每天需要ri张桌布,桌布可以现买,p元.可以通过快洗店,等m天,f元.可以通过慢洗店,等n ...
- 洛谷P4480 【[BJWC2018]餐巾计划问题】
这道题和网络流 \(24\) 题中的餐巾计划的确不一样, \([\) \(BJWC\) \(2018\) \(]\) 餐巾计划问题的数据范围更大. 一个餐厅在相继的 \(n\) 天里,每天需用的餐巾数 ...
- 初识费用流 模板(spfa+slf优化) 餐巾计划问题
今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...
- 【网络流24题】餐巾计划问题(最小费用最大流)
[网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 ...
- 餐巾计划问题 线性规划与网络流24题之10 费用流
相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...
- 网络流24题 餐巾计划(DCOJ8008)
题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_iri 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分:或者把旧餐巾送到快 ...
- [codevs 1237] 餐巾计划问题
http://codevs.cn/problem/1237/ 题解: 引用<24题>: 把每天分为二分图两个集合中的顶点Xi,Yi,建立附加源S汇T. 1.从S向每个Xi连一条容量为ri, ...
最新文章
- 学python需要学数据库吗-学习Python爬虫前,你必须知道的一些工具!
- 【USACO2006 Mar】滑雪缆车 skilift
- 剖析Caffe源码之Net---Net构造函数
- 国开计算机专业英语章节测试答案,国开大201x理工英语1第七单元网上测试答案...
- 设计灵感|排版太死板?提高品质的角度很重要
- 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)
- 详解分布式系统与消息投递(架构师必备)
- 从PCI上读取数据 线程和定时器效率
- apue.h文件找不到的解决办法
- Dubbo性能调优参数及原理
- Web前端 Js文件上传类型限制(根据文件头信息判断)
- python 写入文件 wb_python读写文件
- Java获取图片传到前端,生成二维码给前端
- 抽奖活动mysql表设计_购物商城数据库设计-商品表设计
- 锂电池剩余寿命预测(简单介绍)
- python九九乘法口诀_Python打印出九九乘法口诀
- 调用iframe子页面中的函数
- 黄淮学院计算机类专业属于几本,黄淮学院是几本院校
- 简直无敌!5年crud经验,全网独家首发!
- 乔纳森·詹姆斯,世界五大顶尖黑客之一
热门文章
- 几款款UI在线设计软件,办公必备
- apple tv 开发_如何在新的Apple TV上管理存储空间
- MicroExpSTCNN and MicroExpFuseNet-基于三维时空卷积神经网络的自发面部微表情识别
- 徐亦达老师机器学习课程
- 云的基本概念(公有云、私有云、混合云, IaaS、PaaS、SaaS)
- word中px,pt,dpi,in,em,twip,emu之间的关系
- java 监测粘贴板事件_Java 监视系统剪贴板
- Goolgle10个搜索技巧
- qt感叹号_QT使用教程(四)之初体验
- 解决VsCode感叹号快捷键生成html骨架失效