(题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......)

题目链接:https://www.luogu.org/problemnew/show/P1251

洛谷 P1251 餐巾计划问题

输入输出样例

输入样例#1:

  1. 3
  2. 1 7 5
  3. 11 2 2 3 1
输出样例#1:

  1. 134

说明

N<=2000

ri<=10000000

p,f,s<=10000

时限4s

题解:拆点再跑费用流呗,第i天拆成Xi(脏的餐巾)和Yi(干净的餐巾)。对于每天情况,建图示例如下(解释详见代码注释):

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = ;
  5. const int M = ;
  6. const ll INF = 1e18;
  7. const int INF2 = 1e9;
  8. struct Edge { int to,next,cap,flow,cost; }edge[M];
  9. int head[N],tol;
  10. int pre[N];
  11. ll dis[N];
  12. bool vis[N];
  13. int V;
  14. void init(int n) {
  15. V = n;
  16. tol = ;
  17. memset(head,-,sizeof(head));
  18. }
  19. void addedge(int u,int v,int cap,int cost) {
  20. edge[tol].to = v; edge[tol].cap = cap; edge[tol].cost = cost; edge[tol].flow = ; edge[tol].next = head[u]; head[u] = tol++;
  21. edge[tol].to = u; edge[tol].cap = ; edge[tol].cost = -cost; edge[tol].flow = ; edge[tol].next = head[v]; head[v] = tol++;
  22. }
  23. bool spfa(int s,int t) {
  24. queue<int>q;
  25. for(int i = ;i < V;i++) {
  26. dis[i] = INF;
  27. vis[i] = false;
  28. pre[i] = -;
  29. }
  30. dis[s] = ;
  31. vis[s] = true;
  32. q.push(s);
  33. while(!q.empty()) {
  34. int u = q.front();
  35. q.pop();
  36. vis[u] = false;
  37. for(int i = head[u]; i != -;i = edge[i].next) {
  38. int v = edge[i].to;
  39. if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost ) {
  40. dis[v] = dis[u] + edge[i].cost;
  41. pre[v] = i;
  42. if(!vis[v]) {
  43. vis[v] = true;
  44. q.push(v);
  45. }
  46. }
  47. }
  48. }
  49. if(pre[t] == -) return false;
  50. else return true;
  51. }
  52. ll minCostMaxflow(int s,int t,ll &cost) {
  53. ll flow = ;
  54. cost = ;
  55. while(spfa(s,t)) {
  56. ll Min = INF;
  57. for(int i = pre[t];i != -;i = pre[edge[i^].to]) {
  58. if(Min > edge[i].cap - edge[i].flow)
  59. Min = edge[i].cap - edge[i].flow;
  60. }
  61. for(int i = pre[t];i != -;i = pre[edge[i^].to]) {
  62. edge[i].flow += Min;
  63. edge[i^].flow -= Min;
  64. cost += edge[i].cost * Min;
  65. }
  66. flow += Min;
  67. }
  68. return flow;
  69. }
  70. int main() {
  71. int n, r, i, j, p, m, f, nn, s;
  72. ll ans = ;
  73. scanf("%d", &n);
  74. init(n*+);
  75.  
  76. int S = n*+, T = n*+;
  77.  
  78. for(i = ; i <= n; ++i) {
  79. scanf("%d", &r);//每天需要餐巾数
  80. addedge(S, i, r, );
  81. addedge(i+n, T, r, );
  82. }
  83. scanf("%d%d%d%d%d", &p, &m, &f, &nn, &s);
  84. for(i = ; i <= n; ++i) {
  85. addedge(S, i+n, INF2, p);//购买新餐巾
  86. if(i+m<=n) addedge(i, i+m+n, INF2, f);//快洗
  87. if(i+nn<=n) addedge(i, i+nn+n, INF2, s);//慢洗
  88. if(i!=n) addedge(i, i+, INF2, );//留到第二天
  89. }
  90.  
  91. minCostMaxflow(S, T, ans);
  92. printf("%lld\n", ans);
  93. return ;
  94. }

洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】的更多相关文章

  1. 洛谷 P1251 餐巾计划问题【最小费用最大流】

    建图细节比较多,对于每个点i,拆成i和i',i表示用的餐巾,i'表示脏餐巾,连接: (s,i,r[i],p)表示在这一天买新餐巾 (i,t,r[i],0)表示这一天用了r[i]的餐巾 (s,i+n,r ...

  2. [洛谷P1251]餐巾计划问题

    题目大意:一个餐厅N天,每天需要$r_i$块餐巾.每块餐巾需要p元,每天用过的餐巾变脏,不能直接用.现在有快洗店和慢洗店,快洗店洗餐巾需要m天,每块花费f元:慢洗店洗餐巾需要n天,每块餐巾s元(m & ...

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

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

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

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

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

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

  6. 洛谷 P1251 餐巾计划问题

    题目链接 最小费用最大流. 每天拆成两个点,早上和晚上: 晚上可以获得\(r_i\)条脏毛巾,从源点连一条容量为\(r_i\),费用为0的边. 早上要供应\(r_i\)条毛巾,连向汇点一条容量为\(r ...

  7. 洛谷P1251 餐巾(网络流)

    P1251 餐巾 15通过 95提交 题目提供者该用户不存在 标签网络流贪心 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 为什么我全部10个测试点都对… 题目描述 一个餐厅在相继的N天里 ...

  8. 洛谷 [P251] 餐巾计划问题

    有上下界的最小费用最大流 可以联想到供求平衡问题,所以我们要拆点做这道题 把每天分为二分图两个集合中的顶点Xi,Yi,建立附加源S汇T. 1.从S向每个Xi连一条容量为ri,费用为0的有向边. 2.从 ...

  9. 洛谷.1251.餐巾计划问题(费用流SPFA)

    题目链接 /* 每一天的餐巾需求相当于必须遍历某些点若干次 设q[i]为Dayi需求量 (x,y)表示边x容y费 将每个点i拆成i,i',由i'->T连(q[i],0)的边,表示求最大流的话一定 ...

随机推荐

  1. 对于移动端浏览器touch事件的研究总结(4)判断手指滑动方向

    最近有一些微信的项目,虽然页面很简单,但配合手势后的效果却是很不错的.最基本的效果就是手指向上滑,页面配合css3出现一个展开效果,手指向下滑将展开的内容按原路径收起.其实就是一个简单的判断手指滑动方 ...

  2. 【基于初学者的SSH】struts2 值栈的详解与struts2标签库+ognl表达式

    一:什么是值栈:struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值 特点:先进后出,最上面的元素叫做栈顶,也叫压栈. <s:debug></s:debug& ...

  3. 高性能分布式锁-redisson

    RedLock算法-使用redis实现分布式锁服务 译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件. 许多库使用不同的方式使用redis实现一个分布式锁管理. 其中 ...

  4. Java中响应结果工具类,可自定义响应码,内容,响应消息

    创建响应状态码和说明枚举类 /** * 响应状态码和说明 */public enum CodeEnum {    SUCCESS(0, "成功!"),    FAIL(1, &qu ...

  5. 超详细的HashMap解析(jdk1.8)

    目录 一.预备知识 时间复杂度 基本数据结构 基本位运算 二.HashMap实现原理 结构 速度 三.源码分析 基本常量 基本成员变量 构造方法 put方法 remove 四.日常使用注意事项 五.总 ...

  6. P2P文件上传

    采用uploadify上传  官网:http://www.uploadify.com/  (有H5版本和flash版本,H5收费,所以暂时用flash) uploadify的重要配置属性(http:/ ...

  7. ANT DESIGN PRO 脚手架.... 懒人福音

    早上在用蚂蚁组件,看到一个红红的 PRO , 什么鬼,点了看. https://pro.ant.design/index-cn 一脸懵逼, 中台前端??? 预览再看: 后台管理的demo , 脚手架  ...

  8. Andoid多语言国际化策略

    目前手上的项目,为了普及覆盖更多的用户群,也已经开始实现了多语言设置这样的功能,不过今天我要说的不是微信,而是我们自己项目中的实现策略. 直接附上关键代码: package com.huolonglu ...

  9. 一步一步pwn路由器之radare2使用全解

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 radare2 最近越来越流行,已经进入 github 前 25了 ...

  10. 构建微服务:快速搭建Spring Boot项目

    Spring Boot简介: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...