传送门: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】餐巾计划问题相关推荐

  1. 洛谷P1251 餐巾计划问题 无汇源最小费用流

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...

  2. 费用流 ---- P1251 餐巾计划问题[拆点](网络流24题)

    题目链接 题目大意: 解题思路 将脏餐巾以f元/条送到快洗部,过m天后,干净餐巾送回来使用 将脏餐巾以s元/条送到慢洗部,过n天后,干净餐巾送回来使用 延期送洗(可能会出现之后餐巾需求过少,并不需要所 ...

  3. 洛谷 - P1251 餐巾计划问题(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n天每天所需要的新餐巾的数量,现在有多种方式可以获得新餐巾,问如何运营能使花费最少: 直接购买,花费为cost 将脏餐巾送到快洗部,需要洗t1天,花费为c1 将脏餐巾 ...

  4. P1251 餐巾计划问题 费用流

    https://www.luogu.org/problemnew/show/P1251 题意 有一家酒店,酒店每天需要ri张桌布,桌布可以现买,p元.可以通过快洗店,等m天,f元.可以通过慢洗店,等n ...

  5. 洛谷P4480 【[BJWC2018]餐巾计划问题】

    这道题和网络流 \(24\) 题中的餐巾计划的确不一样, \([\) \(BJWC\) \(2018\) \(]\) 餐巾计划问题的数据范围更大. 一个餐厅在相继的 \(n\) 天里,每天需用的餐巾数 ...

  6. 初识费用流 模板(spfa+slf优化) 餐巾计划问题

    今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...

  7. 【网络流24题】餐巾计划问题(最小费用最大流)

    [网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 ...

  8. 餐巾计划问题 线性规划与网络流24题之10 费用流

    相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...

  9. 网络流24题 餐巾计划(DCOJ8008)

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

  10. [codevs 1237] 餐巾计划问题

    http://codevs.cn/problem/1237/ 题解: 引用<24题>: 把每天分为二分图两个集合中的顶点Xi,Yi,建立附加源S汇T. 1.从S向每个Xi连一条容量为ri, ...

最新文章

  1. 学python需要学数据库吗-学习Python爬虫前,你必须知道的一些工具!
  2. 【USACO2006 Mar】滑雪缆车 skilift
  3. 剖析Caffe源码之Net---Net构造函数
  4. 国开计算机专业英语章节测试答案,国开大201x理工英语1第七单元网上测试答案...
  5. 设计灵感|排版太死板?提高品质的角度很重要
  6. 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)
  7. 详解分布式系统与消息投递(架构师必备)
  8. 从PCI上读取数据 线程和定时器效率
  9. apue.h文件找不到的解决办法
  10. Dubbo性能调优参数及原理
  11. Web前端 Js文件上传类型限制(根据文件头信息判断)
  12. python 写入文件 wb_python读写文件
  13. Java获取图片传到前端,生成二维码给前端
  14. 抽奖活动mysql表设计_购物商城数据库设计-商品表设计
  15. 锂电池剩余寿命预测(简单介绍)
  16. python九九乘法口诀_Python打印出九九乘法口诀
  17. 调用iframe子页面中的函数
  18. 黄淮学院计算机类专业属于几本,黄淮学院是几本院校
  19. 简直无敌!5年crud经验,全网独家首发!
  20. 乔纳森·詹姆斯,世界五大顶尖黑客之一

热门文章

  1. 几款款UI在线设计软件,办公必备
  2. apple tv 开发_如何在新的Apple TV上管理存储空间
  3. MicroExpSTCNN and MicroExpFuseNet-基于三维时空卷积神经网络的自发面部微表情识别
  4. 徐亦达老师机器学习课程
  5. 云的基本概念(公有云、私有云、混合云, IaaS、PaaS、SaaS)
  6. word中px,pt,dpi,in,em,twip,emu之间的关系
  7. java 监测粘贴板事件_Java 监视系统剪贴板
  8. Goolgle10个搜索技巧
  9. qt感叹号_QT使用教程(四)之初体验
  10. 解决VsCode感叹号快捷键生成html骨架失效