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最小费用最大流即可。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxN=3100;
  8. const int maxM=maxN*maxN*2;
  9. const int inf=2147483647;
  10. class Edge
  11. {
  12. public:
  13. int u,v,cost,flow;
  14. };
  15. int n,P,d1,c1,d2,c2;
  16. int cnt=-1;
  17. int Head[maxN];
  18. int Next[maxM];
  19. Edge E[maxM];
  20. int Dist[maxN];
  21. int path[maxN];
  22. int Q[maxN*100];
  23. bool inqueue[maxN];
  24. int Flow[maxN];
  25. void Add_Edge(int u,int v,int cost,int flow);
  26. bool spfa();
  27. int main()
  28. {
  29. memset(Head,-1,sizeof(Head));
  30. scanf("%d%d%d%d%d%d",&n,&P,&d1,&c1,&d2,&c2);
  31. for (int i=1;i<=n;i++)
  32. {
  33. int r;
  34. scanf("%d",&r);
  35. Add_Edge(0,i,0,r);//源点到旧餐巾
  36. Add_Edge(0,i+n,P,inf);//从源点到新餐巾,即新购买餐巾
  37. Add_Edge(i+n,n*2+1,0,r);//从新餐巾到汇点,表示要用掉这么多餐巾
  38. if (i+1<=n)
  39. Add_Edge(i,i+1,0,inf);//延时送洗
  40. if (i+d1<=n)
  41. Add_Edge(i,i+d1+n,c1,inf);//送到快洗部
  42. if (i+d2<=n)
  43. Add_Edge(i,i+d2+n,c2,inf);//送到慢洗部
  44. }
  45. int Ans=0;
  46. while (spfa())
  47. {
  48. int now=n*2+1;
  49. int p=path[now];
  50. while (now!=0)
  51. {
  52. E[p].flow-=Flow[n*2+1];
  53. E[p^1].flow+=Flow[n*2+1];
  54. now=E[p].u;
  55. p=path[now];
  56. }
  57. Ans+=Flow[n*2+1]*Dist[n*2+1];
  58. }
  59. cout<<Ans<<endl;
  60. return 0;
  61. }
  62. void Add_Edge(int u,int v,int cost,int flow)
  63. {
  64. cnt++;
  65. Next[cnt]=Head[u];
  66. Head[u]=cnt;
  67. E[cnt].u=u;
  68. E[cnt].v=v;
  69. E[cnt].cost=cost;
  70. E[cnt].flow=flow;
  71. cnt++;
  72. Next[cnt]=Head[v];
  73. Head[v]=cnt;
  74. E[cnt].u=v;
  75. E[cnt].v=u;
  76. E[cnt].cost=-cost;
  77. E[cnt].flow=0;
  78. }
  79. bool spfa()
  80. {
  81. memset(Dist,-1,sizeof(Dist));
  82. memset(inqueue,0,sizeof(inqueue));
  83. int h=1,t=0;
  84. Q[1]=0;
  85. Dist[0]=0;
  86. inqueue[0]=1;
  87. Flow[0]=inf;
  88. do
  89. {
  90. t++;
  91. int u=Q[t];
  92. inqueue[u]=0;
  93. for (int i=Head[u];i!=-1;i=Next[i])
  94. {
  95. int v=E[i].v;
  96. if ((E[i].flow>0)&&((E[i].cost+Dist[u]<Dist[v])||(Dist[v]==-1)))
  97. {
  98. Dist[v]=Dist[u]+E[i].cost;
  99. path[v]=i;
  100. Flow[v]=min(Flow[u],E[i].flow);
  101. if (inqueue[v]==0)
  102. {
  103. h++;
  104. Q[h]=v;
  105. inqueue[v]=1;
  106. }
  107. }
  108. }
  109. }
  110. while (h!=t);
  111. if (Dist[n*2+1]==-1)
  112. return 0;
  113. return 1;
  114. }

Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)的更多相关文章

  1. LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图

    #6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

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

    #6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_ir​i​​ 块餐巾.餐厅可以购买新的餐巾,每块餐 ...

  3. [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划

    [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...

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

    这道题其实我在刚学 OI 的时候就在一本通上看见过,还记得上面写着"新餐巾一次性买完"之类的话.当时还很稚嫩(现在也是),想了好久,根本想不出来. 学了网络流之后发现这道题的图也是 ...

  5. 【刷题】LOJ 6008 「网络流 24 题」餐巾计划

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

  6. Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)

    Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...

  7. Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)

    Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...

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

    #6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

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

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

随机推荐

  1. 20155226 《网络对抗》Exp 8 Web基础

    20155226 <网络对抗>Exp 8 Web基础 实践内容 1.Web前端HTML 配置环境 正常安装.启动Apache 安装:sudo apt-get install apache2 ...

  2. 20155306白皎 《网络对抗》 Exp9 Web安全基础实践

    20155306白皎 <网络对抗> Exp9 Web安全基础实践 一.基本问题回答 SQL注入攻击原理,如何防御 原理是: 就是通过把SQL命令插入到"Web表单递交" ...

  3. 20155313 杨瀚 《网络对抗技术》实验一 PC平台逆向破解(5)M

    exp1 PC平台逆向破解(5)M 一.实验内容 1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发 ...

  4. 对*P++的理解,再联想~~~

    前言: 最近在看一位叫朱有鹏大神的视频,讲的甚好.应此,我的感悟也因此被激发,准备针对朱老师将的内容,结合自己的理解,写一个系列的笔记博客--大家可以去www.zhulaoshi.org观看视频-- ...

  5. post请求参数Json字符串包含数组的校验和处理

    传入参数类型 {"aaa":"aaaa","bbb":"bbb","ccc":"ccc&q ...

  6. 面向对象第一次练手-------ArrayList集合、类、对象、冒泡排序、类型转换

    思维转不过弯儿来  怎么做都是错      哪怕差一个()就成功的事情,也是千差万别 忽然想到一句话:差一步就成功的距离  =  差几万米就成功的距离 部分的理解和都体现在代码和注释里 using S ...

  7. 调试OV2735总结

    调试找到的问题: 1:开始调试的时候因为之前的工程师原理图和BOM出错,导致本来是2.8V电压的焊接的是1.8V的LDO所以这个是第一个问题 2:因为FAE反应说sensor没有反应I2C没有通信,所 ...

  8. X32位 天堂2 二章/三章 服务端协议号修改方法

    [本方法适合于2004-2006年之间天堂2由初章服务端修改至二章.三章端时协议号匹配问题]服务端版本位32位初章服务端 目前大部分SF用的协议号情况: 服务端是419 客户端是 417 419 42 ...

  9. DRF03

    为了方便接下来的操作,需要在admin站点创建一个管理员. python manage.py createsuperuser 可在setting.py中修改admin站点语言, LANGUAGE_CO ...

  10. hyperledger-fabirc1.2-ca-server的生产示例

    hyperledger-fabirc1.2-ca-server的生产示例,带TLS 在fabirc-samples/first-network中启动网络,其ca证书是利用crypto的工具生成的,但是 ...