P1251 餐巾计划问题 网络流
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int maxn = , inf = 0x3f3f3f3f;
- struct Edge {
- int from, to;
- ll cap, flow, cost;
- };
- struct MCMF {
- int n, m, s, t;
- vector<Edge> edges;
- vector<int> G[maxn];
- int inq[maxn];
- ll d[maxn];
- int p[maxn];
- ll a[maxn];
- void init(int n) {
- this->n = n;
- for (int i = ; i <= n; ++i) G[i].clear();
- edges.clear();
- }
- void AddEdge(int from, int to, ll cap, ll cost) {
- edges.push_back((Edge){from, to, cap, , cost});
- edges.push_back((Edge){to, from, , , -cost});
- m = edges.size();
- G[from].push_back(m-);
- G[to].push_back(m-);
- }
- bool BellmanFord(int s, int t, ll& flow, ll& cost) {
- for (int i = ; i <= n; ++i) d[i] = inf;
- memset(inq, , sizeof(inq));
- d[s] = ; inq[s] = ; p[s] = ; a[s] = inf;
- queue<int> que;
- que.push(s);
- while (!que.empty()) {
- int u = que.front(); que.pop();
- inq[u] = ;
- for (int i = ; i < G[u].size(); ++i) {
- Edge& e = edges[G[u][i]];
- if (e.cap > e.flow && d[e.to] > d[u] + e.cost) {
- d[e.to] = d[u] + e.cost;
- p[e.to] = G[u][i];
- a[e.to] = min(a[u], e.cap-e.flow);
- if (!inq[e.to]) { que.push(e.to); inq[e.to] = ; }
- }
- }
- }
- if (d[t] == inf) return false;
- flow += a[t];
- cost += d[t] * a[t];
- int u = t;
- while (u != s) {
- edges[p[u]].flow += a[t];
- edges[p[u]^].flow -= a[t];
- u = edges[p[u]].from;
- }
- return true;
- }
- ll mincost(int s, int t) {
- ll flow = , cost = ;
- while (BellmanFord(s, t, flow, cost));
- return cost;
- }
- }mcmf;
- int r[maxn];
- int main() {
- int N; scanf("%d",&N);
- for (int i = ; i <= N; ++i) {
- scanf("%d",&r[i]);
- }
- int p, m, f, n, s;
- scanf("%d%d%d%d%d",&p,&m,&f,&n,&s);
- /// i为干净餐巾量,i+N为脏餐巾量
- int be = *N+, ed = *N+;
- mcmf.init(*N+);
- for (int i = ; i <= N; ++i) {
- /// 通过购买来获得干净餐巾
- mcmf.AddEdge(be,i,r[i],p);
- /// 当天的脏餐巾如何使用
- mcmf.AddEdge(be,i+N,r[i],);
- /// 当天的脏餐巾留到明天
- if (i+ <= N) mcmf.AddEdge(i+N,(i+)+N,inf,);
- /// 通过快洗部洗脏餐巾
- if (i+m <= N) mcmf.AddEdge(i+N,i+m,inf,f);
- /// 通过慢洗部洗脏餐巾
- if (i+n <= N) mcmf.AddEdge(i+N,i+n,inf,s);
- /// 使用当天的干净餐巾
- mcmf.AddEdge(i,ed,r[i],);
- }
- ll ans = mcmf.mincost(be,ed);
- printf("%lld\n",ans);
- return ;
- }
P1251 餐巾计划问题 网络流的更多相关文章
- P1251 餐巾计划问题
P1251 餐巾计划问题 题目描述 一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 iii 天需要 rir_iri块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费 ...
- Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)
Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...
- 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】
(题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...
- 网络流之最小费用最大流 P1251 餐巾计划问题
题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...
- 网络流24题 P1251 餐巾计划问题 拆点
题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...
- P1251 餐巾计划 (网络流)
题意:餐厅每天会需要用Ri块新的餐巾 用完后也会产生Ri块旧的餐巾 每天购买新的餐巾单价p元 每天产出的旧餐巾可以送到快洗部花费每张c1元 在i + v1天可以使用 也可以花费c2元每张送到慢洗部 在 ...
- 洛谷P1251 餐巾计划问题(费用流)
传送门 不得不说这题真是思路清奇,真是网络流的一道好题,完全没想到网络流的建图还可以这么建 我们把每一个点拆成两个点,分别表示白天和晚上,白天可以得到干净的餐巾(购买的,慢洗的,快洗的),晚上可以得到 ...
- 【Luogu】P1251餐巾计划(上下界费用流)
题目链接 学了一下上下界费用流,似乎很nb.但是我说得不好,所以这里给出博客链接. 某dalao的博客 然后这道题的解法就是先用上下界费用流的建图方式连早上和晚上之间的那条边,保证当天一定会有r条或以 ...
- 洛谷P1251 餐巾计划问题(最小费用最大流)
题意 一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径 1.以$p$的费用买 2.以$f$的费用送到快洗部,并在$m$天后取出 3.以$s$的费用送到慢洗部,并在$n$天后取出 问满足 ...
随机推荐
- Spring Cloud 系列之 Sleuth 链路追踪(三)
本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Sleuth 链路追踪(一) Spring Cloud 系列之 Sleuth 链路追踪(二) 本篇文章讲解 Sleu ...
- 浅谈 PHP 与手机 APP 开发
来源:http://www.thinkphp.cn/topic/5023.html 一.先简单回答两个问题: 1.PHP 可以开发客户端?答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 ...
- 日志分析工具ELK(二)
五.Logstash日志收集实践 在学习Logstash之前,我们需要先了解以下几个基本概念: logstash收集日志基本流程: input-->codec-->filter--> ...
- 我做了一个 HTML 可视化编辑工具,有前途吗?
疫情在家的这段时间,我做了一个 HTML 可视化编辑工具,做的时候信心满满,差不多完成了,现在反而不如以前信心足了,这玩意有用吗?代码地址: https://github.com/vularsoft/ ...
- Lambda表达式最佳实践
简介 Lambda表达式java 8引入的函数式编程框架.之前的文章中我们也讲过Lambda表达式的基本用法. 本文将会在之前的文章基础上更加详细的讲解Lambda表达式在实际应用中的最佳实践经验. ...
- "net.sf.hibernate.PropertyValueException"
2019独角兽企业重金招聘Python工程师标准>>> 如果你遇到了下面的错误信息,例如: ERROR [Importing data task] [confluence.impor ...
- unittest(简介)
一.unittest框架介绍: unittest框架是python中的一个单元测试框架,该模块包括许多的类如 TestCase 类.TestSuite 类.TextTestRunner 类.TestR ...
- 记一次真实的线上事故:一个update引发的惨案!
目录 前言 项目背景介绍 要命的update 结语 前言 从事互联网开发这几年,参与了许多项目的架构分析,数据库设计,改过的bug不计其数,写过的sql数以万计,从未出现重大纰漏,但常在河边走,哪 ...
- 使用kubeadm部署k8s集群[v1.18.0]
使用kubeadm部署k8s集群 环境 IP地址 主机名 节点 10.0.0.63 k8s-master1 master1 10.0.0.63 k8s-master2 master2 10.0.0.6 ...
- P2002 消息扩散(缩点)
描述:https://www.luogu.com.cn/problem/P2002 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能 ...