P1251 餐巾计划问题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn = , inf = 0x3f3f3f3f;
  5. struct Edge {
  6. int from, to;
  7. ll cap, flow, cost;
  8. };
  9.  
  10. struct MCMF {
  11. int n, m, s, t;
  12. vector<Edge> edges;
  13. vector<int> G[maxn];
  14. int inq[maxn];
  15. ll d[maxn];
  16. int p[maxn];
  17. ll a[maxn];
  18.  
  19. void init(int n) {
  20. this->n = n;
  21. for (int i = ; i <= n; ++i) G[i].clear();
  22. edges.clear();
  23. }
  24.  
  25. void AddEdge(int from, int to, ll cap, ll cost) {
  26. edges.push_back((Edge){from, to, cap, , cost});
  27. edges.push_back((Edge){to, from, , , -cost});
  28. m = edges.size();
  29. G[from].push_back(m-);
  30. G[to].push_back(m-);
  31. }
  32. bool BellmanFord(int s, int t, ll& flow, ll& cost) {
  33. for (int i = ; i <= n; ++i) d[i] = inf;
  34. memset(inq, , sizeof(inq));
  35. d[s] = ; inq[s] = ; p[s] = ; a[s] = inf;
  36.  
  37. queue<int> que;
  38. que.push(s);
  39. while (!que.empty()) {
  40. int u = que.front(); que.pop();
  41. inq[u] = ;
  42. for (int i = ; i < G[u].size(); ++i) {
  43. Edge& e = edges[G[u][i]];
  44. if (e.cap > e.flow && d[e.to] > d[u] + e.cost) {
  45. d[e.to] = d[u] + e.cost;
  46. p[e.to] = G[u][i];
  47. a[e.to] = min(a[u], e.cap-e.flow);
  48. if (!inq[e.to]) { que.push(e.to); inq[e.to] = ; }
  49. }
  50. }
  51. }
  52. if (d[t] == inf) return false;
  53. flow += a[t];
  54. cost += d[t] * a[t];
  55. int u = t;
  56. while (u != s) {
  57. edges[p[u]].flow += a[t];
  58. edges[p[u]^].flow -= a[t];
  59. u = edges[p[u]].from;
  60. }
  61. return true;
  62. }
  63. ll mincost(int s, int t) {
  64. ll flow = , cost = ;
  65. while (BellmanFord(s, t, flow, cost));
  66. return cost;
  67. }
  68. }mcmf;
  69. int r[maxn];
  70. int main() {
  71. int N; scanf("%d",&N);
  72. for (int i = ; i <= N; ++i) {
  73. scanf("%d",&r[i]);
  74. }
  75. int p, m, f, n, s;
  76. scanf("%d%d%d%d%d",&p,&m,&f,&n,&s);
  77.  
  78. /// i为干净餐巾量,i+N为脏餐巾量
  79. int be = *N+, ed = *N+;
  80. mcmf.init(*N+);
  81. for (int i = ; i <= N; ++i) {
  82. /// 通过购买来获得干净餐巾
  83. mcmf.AddEdge(be,i,r[i],p);
  84. /// 当天的脏餐巾如何使用
  85. mcmf.AddEdge(be,i+N,r[i],);
  86. /// 当天的脏餐巾留到明天
  87. if (i+ <= N) mcmf.AddEdge(i+N,(i+)+N,inf,);
  88. /// 通过快洗部洗脏餐巾
  89. if (i+m <= N) mcmf.AddEdge(i+N,i+m,inf,f);
  90. /// 通过慢洗部洗脏餐巾
  91. if (i+n <= N) mcmf.AddEdge(i+N,i+n,inf,s);
  92. /// 使用当天的干净餐巾
  93. mcmf.AddEdge(i,ed,r[i],);
  94. }
  95. ll ans = mcmf.mincost(be,ed);
  96. printf("%lld\n",ans);
  97. return ;
  98. }

P1251 餐巾计划问题 网络流的更多相关文章

  1. P1251 餐巾计划问题

    P1251 餐巾计划问题 题目描述 一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 iii 天需要 rir_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费 ...

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

    Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...

  3. 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】

    (题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...

  4. 网络流之最小费用最大流 P1251 餐巾计划问题

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...

  5. 网络流24题 P1251 餐巾计划问题 拆点

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...

  6. P1251 餐巾计划 (网络流)

    题意:餐厅每天会需要用Ri块新的餐巾 用完后也会产生Ri块旧的餐巾 每天购买新的餐巾单价p元 每天产出的旧餐巾可以送到快洗部花费每张c1元 在i + v1天可以使用 也可以花费c2元每张送到慢洗部 在 ...

  7. 洛谷P1251 餐巾计划问题(费用流)

    传送门 不得不说这题真是思路清奇,真是网络流的一道好题,完全没想到网络流的建图还可以这么建 我们把每一个点拆成两个点,分别表示白天和晚上,白天可以得到干净的餐巾(购买的,慢洗的,快洗的),晚上可以得到 ...

  8. 【Luogu】P1251餐巾计划(上下界费用流)

    题目链接 学了一下上下界费用流,似乎很nb.但是我说得不好,所以这里给出博客链接. 某dalao的博客 然后这道题的解法就是先用上下界费用流的建图方式连早上和晚上之间的那条边,保证当天一定会有r条或以 ...

  9. 洛谷P1251 餐巾计划问题(最小费用最大流)

    题意 一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径 1.以$p$的费用买 2.以$f$的费用送到快洗部,并在$m$天后取出 3.以$s$的费用送到慢洗部,并在$n$天后取出 问满足 ...

随机推荐

  1. php header() 常用content-type

    //定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Content-type: application/at ...

  2. Vue tools开发工具报错Cannot read property '__VUE_DEVTOOLS_UID__' of undefined

    使用 vue tools 开发工具,不显示调试面板中的组件,点击控制台报错: Cannot read property 'VUE_DEVTOOLS_UID' of undefined 在 main.j ...

  3. redhat7.3 dns服务器配置

    1.基本配置 systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 nmcli conne ...

  4. uniq 只能相邻行去重

    uniq只可以将相邻行重复数据进行去重处理: [root@localhost /data/mysql/mysql3306]#last | cut -d ' ' -f 1 | tail -15 > ...

  5. C++类的开发实战--班级成绩管理系统

    #include<bits/stdc++.h> using namespace std; struct birth { int year,month,day; }; struct grad ...

  6. Eclipse 全部快捷一览表(具TM全)

    1. 编辑快捷键 编辑快捷键 介绍 psvm + Tab 生成main方法 sout + tab 生成输出语句 Ctrl+X / Ctrl + Y 删除一行 Ctrl+D 复制一行 Ctrl+/ 或 ...

  7. POJ 2230 Watchcow 欧拉回路的DFS解法(模板题)

    Watchcow Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9974 Accepted: 4307 Special Judg ...

  8. 图论--2-SAT--poj 3678-Katu Puzzle(模板题)

    Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...

  9. P4720【模板】扩展卢卡斯,P2183 礼物

    扩展卢卡斯定理 最近光做模板了 想了解卢卡斯定理的去这里,那题也有我的题解 然而这题和卢卡斯定理并没有太大关系(雾 但是,首先要会的是中国剩余定理和exgcd 卢卡斯定理用于求\(n,m\)大,但模数 ...

  10. 白话typescript中的【extends】和【infer】(含vue3的UnwrapRef)

    大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 分享不易,希望能够得到大家的支持和关注. extends types ...