Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)
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 题」餐巾计划 (网络流,最小费用最大流)相关推荐
- [网络流24题][CODEVS1237]餐巾计划问题(费用流)
题目描述 传送门 题解 拆点,把每天的点拆成xi和yi,xi表示每一天的脏毛巾,yi表示每一天的新毛巾. 从超级源向xi连边,容量为ri,费用为0: 从yi向超级汇连边,容量为ri,费用为0: 从超级 ...
- 【网络流24题】餐巾计划问题(最小费用最大流)
[网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 ...
- liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案
#6006. 「网络流 24 题」试题库 题目描述 假设一个试题库中有 n nn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 m mm 道题组成试卷.并要求试卷 ...
- LibreOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题
#6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...
- 洛谷 - P1251 餐巾计划问题(最小费用最大流+思维建边)
题目链接:点击查看 题目大意:给出n天每天所需要的新餐巾的数量,现在有多种方式可以获得新餐巾,问如何运营能使花费最少: 直接购买,花费为cost 将脏餐巾送到快洗部,需要洗t1天,花费为c1 将脏餐巾 ...
- 网络流24题之餐巾计划问题
题目链接:传送门 时间有点赶,所以写的简略一些了. dalao:这道题不是看看就出来了吗? me:这道题十分难想啊!!!!图好难建啊!!!!但是想到以后就是一个裸题啊!! 要拆点,将每天拆为早上和晚上 ...
- 「网络流24题」 题目列表
「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...
- 「网络流24题」 12. 软件补丁问题
「网络流24题」 12. 软件补丁问题 状压 DP,SPFA 转移. 没错,跟网络流没任何关系. b1.b2.f1.f2 都用二进制存下来,第 i 位表示是否有这个错误. 然后从每位都是 1 到 0 ...
- loj #6226. 「网络流 24 题」骑士共存问题
#6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...
- LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图
#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...
最新文章
- cryptojs php 互通_关于PHP7和CryptoJS的AES加密方式互通
- 程序员转型人工智能工程师,如何在百忙之中不走岔路
- Tomcat - Tomcat 网络通信模型剖析 并发参数解读
- Functions that return a function
- Docker入门简明教程
- shell脚本 变量
- mysql数据库设计255_MySQL数据库设计规范
- Android知识点汇总以及常见面试题
- 诡异的 BOM 字符 \ufeff
- 启动vsftpd失败是什么原因_消防排烟风机不启动的原因是什么呢?
- docker命令总结(二)
- 手机卫星定位系统_真的可以通过手机号码,准确定位对方信息吗?
- 【NLP】文本匹配——Enhanced LSTM for Natural Language Inference阅读与总结
- 第八届中国大学计算机设计大赛,2015年(第八届)中国大学生计算机设计大赛.PDF...
- http服务器究竟做了什么(一)
- uniapp切换中英文
- 春考天津计算机知识点资料,2016年天津春季高考计算机基础考试大纲
- Mac根目录下无法创建文件夹
- 2021年总结 2022年展望
- NancyFX 第五章 Nancy 路由