「网络流24题」餐巾计划问题

题目描述 Description

一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同。假设第 i 天需要 ri块餐巾(i=1,2,…,N)。餐厅可以购买新的餐巾,每块餐巾的费用为 p 分;或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分;或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s<f 分。
每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。
试设计一个算法为餐厅合理地安排好 N 天中餐巾使用计划,使总的花费最小。
编程找出一个最佳餐巾使用计划.

输入描述 Input Description

第 1 行有 6 个正整数 N,p,m,f,n,s。N 是要安排餐巾使用计划的天数;p 是每块新餐巾的费用;m 是快洗部洗一块餐巾需用天数;f 是快洗部洗一块餐巾需要的费用;n 是慢洗部洗一块餐巾需用天数;s 是慢洗部洗一块餐巾需要的费用。接下来的 N 行是餐厅在相继的 N 天里,每天需用的餐巾数。

输出描述 Output Description

将餐厅在相继的 N 天里使用餐巾的最小总花费输出

样例输入 Sample Input

3 10 2 3 3 2

5

6

7

样例输出 Sample Output

145

题目分析

  此题用最小费用流解决  

  题目所说的每天需用ri块餐巾,我们可以这么理解,把一天拆成两个点Xi和Yi(上午和下午),一天既然需要用ri块餐巾,则必定会消耗ri块,所以我们把Xi表示为这一天接受到的干净的餐巾数,Yi表示为消耗的餐巾数,那么就好建边了.

  从Xi-->X(i+1)建一条(inf,0)的边,表示此边容量无穷大,费用为0,理解为前一天可以把没用完的餐巾留到后一天

  从源点S-->每个Xi建一条(inf,p)的边,表示无论如何你至少可以通过买餐巾来达到需求

  从源点S-->每个Yi建一条(ri,0)的边

  从每个Xi-->汇点T点建一条(ri,0)的边

  从每个Yi-->X(i+m)建一条(inf,f)的边表示每天可以送餐巾到快洗部,费用为f

  同理从每个Yi-->X(i+n)建一条(inf,s)的边表示每天可以送餐巾到慢洗部,费用为s

  然后直接跑费用流模板

  上代码

  

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<string>
  4 #include<cmath>
  5 #include<cstring>
  6 #include<algorithm>
  7 #include<cstdlib>
  8 #include<queue>
  9 #define in(i) (i=read())
 10 #define inf (2147483647)
 11 using namespace std;
 12 typedef long long lol;//就是要注意一点因为最大值赋的是int类型最大值,所以有乘法运算就会爆int,so开long long
 13 lol read()
 14 {
 15   lol ans=0,f=1;
 16   char i=getchar();
 17   while(i<‘0‘||i>‘9‘)
 18     {
 19       if(i==‘-‘) f=-1;
 20       i=getchar();
 21     }
 22   while(i>=‘0‘&&i<=‘9‘)
 23     {
 24       ans=(ans<<3)+(ans<<1)+i-‘0‘;
 25       i=getchar();
 26     }
 27   return ans*f;
 28 }
 29 struct edge
 30 {
 31   lol to,next,cap,v;
 32 }e[40010];
 33 lol head[40010];
 34 lol lev[4010],vis[4010];
 35 lol len=1;
 36 void add(lol a,lol b,lol c,lol d)
 37 {
 38   e[++len].to=b;
 39   e[len].next=head[a];
 40   e[len].cap=c;
 41   e[len].v=d;
 42   head[a]=len;
 43 }
 44 lol pre[3010];
 45 bool bfs(lol s,lol t)
 46 {
 47   queue<lol>q;
 48   memset(lev,127/3,sizeof(lev));
 49   q.push(s);
 50   lev[s]=0;
 51   while(!q.empty())
 52     {
 53       lol x=q.front();
 54       q.pop();
 55       for(lol i=head[x];i;i=e[i].next)
 56     {
 57       lol to=e[i].to;
 58       if(e[i].cap>0&&lev[to]>lev[x]+e[i].v)
 59         {
 60           lev[to]=lev[x]+e[i].v;
 61           pre[to]=i;
 62           q.push(to);
 63         }
 64     }
 65     }
 66   if(lev[t]<lev[0]) return 1;
 67   return 0;
 68 }
 69 lol change(lol s,lol t)
 70 {
 71   lol x=t,flow=inf,ans=0;
 72   while(x!=s)
 73     {
 74       flow=min(flow,e[pre[x]].cap);
 75       x=e[pre[x]^1].to;
 76     }
 77   x=t;
 78   while(x!=s)
 79     {
 80       e[pre[x]].cap-=flow;
 81       e[pre[x]^1].cap+=flow;
 82       ans+=flow*e[pre[x]].v;
 83       x=e[pre[x]^1].to;
 84     }
 85   return ans;
 86 }
 87 int main()
 88 {
 89   lol tot=0;
 90   lol n,r;
 91   lol p,a,f,b,s;
 92   in(n);
 93   for(lol i=1;i<=n;i++)
 94     {
 95       in(r);
 96       add(i,(n<<1)+2,r,0);//Xi-->T
 97       add((n<<1)+2,i,0,0);
 98       add((n<<1)+1,i+n,r,0);//S-->Yi
 99       add(i+n,(n<<1)+1,0,0);
100     }
101   in(p);
102   for(lol i=1;i<=n;i++)
103     {
104       add((n<<1)+1,i,inf,p);//S-->Xi,买餐巾
105       add(i,(n<<1)+1,0,-p);
106     }
107   for(lol i=1;i<n;i++)
108     {
109       add(i,i+1,inf,0);//前一天留到第二天
110       add(i+1,i,0,0);
111     }
112   in(a);in(f);
113   for(lol i=1;i<=n-a;i++)
114     {
115       add(i+n,i+a,inf,f);//送到快洗部
116       add(i+a,i+n,0,-f);
117     }
118   in(b);in(s);
119   for(lol i=1;i<=n-b;i++)
120     {
121       add(i+n,i+b,inf,s);//送到慢洗部
122       add(i+b,i+n,0,-s);
123     }
124   while(bfs((n<<1)+1,(n<<1)+2))
125     {
126       tot+=change((n<<1)+1,(n<<1)+2);
127     }
128   cout<<tot<<endl;
129   return 0;
130 }

原文地址:https://www.cnblogs.com/real-l/p/8412951.html

时间: 2024-10-08 12:10:52

「网络流24题」餐巾计划问题的相关文章

LOJ #6008. 「网络流 24 题」餐巾计划

#6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_ir?i?? 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分:或者把旧餐巾送到快洗部,洗一块需 M MM天,其费用为 F FF 分:或者送到慢洗部,洗一块需 N NN 天,其费用为 S SS 分(S<F S < FS<F). 每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.

LiberOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题

#6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入格式 文件的第 1 11 行中有 1 11 个正整数 n nn,表示有 n nn 个仓库.第 2 22 行中有 n nn 个

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

#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 E={E1,E2,?,Em} E = \{ E_1, E_2, \cdots, E_m \}E={E?1??,E?2??,?,E?m??},和进行这些实验

「网络流24题」2. 太空飞行计划问题

「网络流24题」2. 太空飞行计划问题 <题目链接> 最大权闭合子图. 源点与实验连边权为实验费用的有向边: 仪器与汇点连边权为仪器费用的有向边: 实验与仪器之间连边权为INF的有向边. 答案为所有与源点相连的边的边权和减去图的最小割. 证明见国集队员胡伯涛论文<最小割模型在信息学竞赛中的应用>. 输出路径时,最后一次层次图中: 与源点相连的点即选做的实验:与汇点相连的点即选用的仪器. 注意 ·读入数据时,读到空格继续,否则停止. ·仪器部分的点权+50,避免两部点权相同. #in

「网络流24题」 题目列表

「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分图最小路径覆盖 <3> 4 魔术球问题 <4> 5 圆桌问题 <5> 6 最长递增子序列问题 <6> 7 试题库问题 <7> 8 机器人路径规划问题 <8> 9 方格取数问题 二分图最大点权独立集 <9> 10 餐巾计划问题

LiberOJ #6000. 「网络流 24 题」搭配飞行员 最大匹配

#6000. 「网络流 24 题」搭配飞行员 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多. 因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行. 输入格式 第一

LiberOJ #6002. 「网络流 24 题」最小路径覆盖

#6002. 「网络流 24 题」最小路径覆盖 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 给定有向图 G=(V,E) G = (V, E)G=(V,E).设 P PP 是 G GG 的一个简单路(顶点不相交)的集合.如果 V VV 中每个顶点恰好在 P PP 的一条路上,则称 P PP 是 G GG 的一个路径覆盖.P PP 中路径可以从 V VV 的任何一个顶点开始,

LiberOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 在一个有 m×n m \times nm×n 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意 2 22 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. 输入格式 文件第 1 11 行有 2 22 个正整数 m mm 和 n nn,分别表示棋盘的行数和列数

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

#6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有来自 n nn 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri r_ir?i??.会议餐厅共有 m mm 张餐桌,每张餐桌可容纳 ci c_ic?i?? 个代表就餐.为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐. 试设计一个算法,给出满足要求的