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

Description

一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,…,N)。餐厅可以从三种途径获得餐巾。
(1)购买新的餐巾,每块需p分;
(2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f<p)。如m=l时,第一天送到快洗部的餐巾第二天就可以使用了,送慢洗的情况也如此。
(3)把餐巾送到慢洗部,洗一块需n天(n>m),费用需s分(s<f)。
在每天结束时,餐厅必须决定多少块用过的餐巾送到快洗部,多少块送慢洗部。在每天开始时,餐厅必须决定是否购买新餐巾及多少,使洗好的和新购的餐巾之和满足当天的需求量Ri,并使N天总的费用最小。

Input

共 n+1 行:
第1行为总天教和每块餐巾的新购费用p,快洗所需天数d1,快洗所需费用c1,慢洗所需天数d2,慢洗所需费用c2;
下n行为每天所需的餐巾块数;

Output

一行,最小的费用

Sample Input

3 10 2 3 3 2
5
6
7

Sample Output

145

Http

Libre:https://loj.ac/problem/6008

Source

网络流,最小费用最大流

解决思路

题目还算好理解,但是建图需要考虑一些东西。
餐巾不管在那一天洗价格都是一样的,所以没有必要提前把旧餐巾洗成新餐巾让后放在那里不用。
首先对于每一天i,我们将其拆成两个点i和i+n,我们把前面一个称为旧餐巾,后面一个称为新餐巾。另建立源点0和汇点n*2+1。
需要连接的边有:

1 源点到旧餐巾,容量为r[i](就是第i天的餐巾需求啦),代价为0,这条表表示这一天有r[i]条新的旧餐巾产生
2 源点到新餐巾,容量为无穷大,代价为新购餐巾的费用。这条边的意思就是新购餐巾
3 新餐巾到汇点,容量为R[i],代价为0。这条边使用来限制第i天只能花掉r[i]条餐巾,也代表着强制让剩余的餐巾向后流,即不让多余的餐巾提前洗掉
4 从第i天的旧餐巾到第i+1天的旧餐巾,容量为无穷大,代价为0。这条边代表的是延时送洗,即把餐巾送到后面几天去
5 从第i天的旧餐巾到第i+d1(即快洗所需时间)天的新餐巾,容量为无穷大,代价为快洗所需代价。这条边代表送到快洗部快洗
6 从第i天的旧餐巾到第i+d2(即慢洗所需时间)天的新餐巾,容量为无穷大,代价为慢洗所需代价。这条边代表送到慢洗部慢洗

然后跑一边spfa最小费用最大流即可。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;const int maxN=3100;
const int maxM=maxN*maxN*2;
const int inf=2147483647;class Edge
{
public:int u,v,cost,flow;
};int n,P,d1,c1,d2,c2;
int cnt=-1;
int Head[maxN];
int Next[maxM];
Edge E[maxM];
int Dist[maxN];
int path[maxN];
int Q[maxN*100];
bool inqueue[maxN];
int Flow[maxN];void Add_Edge(int u,int v,int cost,int flow);
bool spfa();int main()
{memset(Head,-1,sizeof(Head));scanf("%d%d%d%d%d%d",&n,&P,&d1,&c1,&d2,&c2);for (int i=1;i<=n;i++){int r;scanf("%d",&r);Add_Edge(0,i,0,r);//源点到旧餐巾Add_Edge(0,i+n,P,inf);//从源点到新餐巾,即新购买餐巾Add_Edge(i+n,n*2+1,0,r);//从新餐巾到汇点,表示要用掉这么多餐巾if (i+1<=n)Add_Edge(i,i+1,0,inf);//延时送洗if (i+d1<=n)Add_Edge(i,i+d1+n,c1,inf);//送到快洗部if (i+d2<=n)Add_Edge(i,i+d2+n,c2,inf);//送到慢洗部}int Ans=0;while (spfa()){int now=n*2+1;int p=path[now];while (now!=0){E[p].flow-=Flow[n*2+1];E[p^1].flow+=Flow[n*2+1];now=E[p].u;p=path[now];}Ans+=Flow[n*2+1]*Dist[n*2+1];}cout<<Ans<<endl;return 0;
}void Add_Edge(int u,int v,int cost,int flow)
{cnt++;Next[cnt]=Head[u];Head[u]=cnt;E[cnt].u=u;E[cnt].v=v;E[cnt].cost=cost;E[cnt].flow=flow;cnt++;Next[cnt]=Head[v];Head[v]=cnt;E[cnt].u=v;E[cnt].v=u;E[cnt].cost=-cost;E[cnt].flow=0;
}bool spfa()
{memset(Dist,-1,sizeof(Dist));memset(inqueue,0,sizeof(inqueue));int h=1,t=0;Q[1]=0;Dist[0]=0;inqueue[0]=1;Flow[0]=inf;do{t++;int u=Q[t];inqueue[u]=0;for (int i=Head[u];i!=-1;i=Next[i]){int v=E[i].v;if ((E[i].flow>0)&&((E[i].cost+Dist[u]<Dist[v])||(Dist[v]==-1))){Dist[v]=Dist[u]+E[i].cost;path[v]=i;Flow[v]=min(Flow[u],E[i].flow);if (inqueue[v]==0){h++;Q[h]=v;inqueue[v]=1;}}}}while (h!=t);if (Dist[n*2+1]==-1)return 0;return 1;
}

转载于:https://www.cnblogs.com/SYCstudio/p/7287279.html

Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)相关推荐

  1. [网络流24题][CODEVS1237]餐巾计划问题(费用流)

    题目描述 传送门 题解 拆点,把每天的点拆成xi和yi,xi表示每一天的脏毛巾,yi表示每一天的新毛巾. 从超级源向xi连边,容量为ri,费用为0: 从yi向超级汇连边,容量为ri,费用为0: 从超级 ...

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

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

  3. liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案

    #6006. 「网络流 24 题」试题库   题目描述 假设一个试题库中有 n nn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 m mm 道题组成试卷.并要求试卷 ...

  4. LibreOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题

    #6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...

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

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

  6. 网络流24题之餐巾计划问题

    题目链接:传送门 时间有点赶,所以写的简略一些了. dalao:这道题不是看看就出来了吗? me:这道题十分难想啊!!!!图好难建啊!!!!但是想到以后就是一个裸题啊!! 要拆点,将每天拆为早上和晚上 ...

  7. 「网络流24题」 题目列表

    「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...

  8. 「网络流24题」 12. 软件补丁问题

    「网络流24题」 12. 软件补丁问题 状压 DP,SPFA 转移. 没错,跟网络流没任何关系. b1.b2.f1.f2 都用二进制存下来,第 i 位表示是否有这个错误. 然后从每位都是 1 到 0 ...

  9. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...

  10. LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

    #6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...

最新文章

  1. cryptojs php 互通_关于PHP7和CryptoJS的AES加密方式互通
  2. 程序员转型人工智能工程师,如何在百忙之中不走岔路
  3. Tomcat - Tomcat 网络通信模型剖析 并发参数解读
  4. Functions that return a function
  5. Docker入门简明教程
  6. shell脚本 变量
  7. mysql数据库设计255_MySQL数据库设计规范
  8. Android知识点汇总以及常见面试题
  9. 诡异的 BOM 字符 \ufeff
  10. 启动vsftpd失败是什么原因_消防排烟风机不启动的原因是什么呢?
  11. docker命令总结(二)
  12. 手机卫星定位系统_真的可以通过手机号码,准确定位对方信息吗?
  13. 【NLP】文本匹配——Enhanced LSTM for Natural Language Inference阅读与总结
  14. 第八届中国大学计算机设计大赛,2015年(第八届)中国大学生计算机设计大赛.PDF...
  15. http服务器究竟做了什么(一)
  16. uniapp切换中英文
  17. 春考天津计算机知识点资料,2016年天津春季高考计算机基础考试大纲
  18. Mac根目录下无法创建文件夹
  19. 2021年总结 2022年展望
  20. NancyFX 第五章 Nancy 路由

热门文章

  1. 织梦CMS插件合集覆盖几十插件功能采集推送等
  2. FreeMarker源码分析(八)
  3. getchar()用法
  4. 三层交换机原理及实验操作
  5. iOS 网络性能优化之路
  6. 计算机之父童年的故事教学设计,计算机之父童年的故事 教学设计
  7. oracle安装搜狗输入法教程,Ubuntu12.04安装搜狗拼音输入法
  8. 记win10家庭版系统C:\Users用户名中文改英文 详细教程
  9. short转换byte
  10. 美化桌面软件测试面试题,软件测试面试题的经典逻辑题