题目链接:点击查看

题目大意:给出n天每天所需要的新餐巾的数量,现在有多种方式可以获得新餐巾,问如何运营能使花费最少:

  1. 直接购买,花费为cost
  2. 将脏餐巾送到快洗部,需要洗t1天,花费为c1
  3. 将脏餐巾送到慢洗部,需要洗t2天,花费为c2
  4. 将脏餐巾留起来不洗

题目分析:因为是要通过合理的运营使得花费最少,看的出是一道最小费用最大流的题目,问题就是该如何建边,在题目大意中我已经把可以选择的四种操作列举出来了,可以发现四个操作对应的是两个集合,一个集合我们视为每一天的早晨,另一个集合我们视为每一天的晚上,最主要的区别就是每一天的早晨需要一定量的新餐巾,而每一天的晚上会产生一定量的脏餐巾,同时我们设源点和汇点,源点用于源源不断的提供新餐巾,而汇点对应着则是回收脏餐巾

这样一来就可以将上述的四个操作与两个集合一一对应起来了:

  1. 购买对应着源点连到早晨的点
  2. 送到快洗部以及慢洗部对应着晚上的点连到早晨的点
  3. 将脏餐巾留下来对应着晚上的点

如此一来可以建边了:

  1. 源点->每个晚上,流量为当天产生的脏餐巾数量,花费为0(将这么多新餐巾变为脏餐巾)
  2. 每个晚上->下个晚上,流量为无穷大,花费为0(将脏餐巾留起来不洗)
  3. 源点->每个早晨,流量为无穷大,花费为cost(直接购买餐巾)
  4. 每个晚上->慢洗/快洗后的早晨,流量为无穷大,花费为相应花费(慢洗部/快洗部)
  5. 每个早晨->汇点,流量为当前需要的餐巾数量,花费为0(将这么多新餐巾变为脏餐巾)

建边需要很大的思维,不过确实非常巧妙,建好边后直接跑最小费用最大流就好了,有个小细节需要注意一下,因为每日需要的餐巾数量比较多,所以最后的答案爆掉int了,记得开longlong就好了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;//点const int M=1e5+100;//边struct Edge
{int to,w,cost,next;
}edge[M];int head[N],cnt;void addedge(int u,int v,int w,int cost)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].cost=cost;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;edge[cnt].cost=-cost;edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],incf[N],pre[N];bool vis[N];bool spfa(int s,int t)
{memset(d,inf,sizeof(d));memset(vis,false,sizeof(vis));memset(pre,-1,sizeof(pre));queue<int>q;q.push(s);vis[s]=true;incf[s]=inf;d[s]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=false;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;int cost=edge[i].cost;if(!w)continue;if(d[v]>d[u]+cost){d[v]=d[u]+cost;pre[v]=i;incf[v]=min(incf[u],w);if(!vis[v]){vis[v]=true;q.push(v);}}}}return pre[t]!=-1;
}LL update(int s,int t)
{int x=t;while(x!=s){int i=pre[x];edge[i].w-=incf[t];edge[i^1].w+=incf[t];x=edge[i^1].to;}return 1LL*d[t]*incf[t];
}void init()
{memset(head,-1,sizeof(head));cnt=0;
}LL solve(int st,int ed)
{LL ans=0;while(spfa(st,ed))ans+=update(st,ed);return ans;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);init();int n,st=N-1,ed=st-1;scanf("%d",&n);for(int i=1;i<=n;i++){int val;scanf("%d",&val);addedge(st,i,val,0);addedge(i+n,ed,val,0);}int buy,t1,c1,t2,c2;scanf("%d%d%d%d%d",&buy,&t1,&c1,&t2,&c2);for(int i=1;i<=n;i++){if(i+1<=n)addedge(i,i+1,inf,0);if(i+t1<=n)addedge(i,i+t1+n,inf,c1);if(i+t2<=n)addedge(i,i+t2+n,inf,c2);addedge(st,i+n,inf,buy);}printf("%lld\n",solve(st,ed));return 0;
}

洛谷 - P1251 餐巾计划问题(最小费用最大流+思维建边)相关推荐

  1. 洛谷 - P3980 [NOI2008]志愿者招募(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:现在有n天需要志愿者,每一天需要招募的人数是Ai个人,现在有m类志愿者,每类志愿者可以在[l,r]天内被招募,需要花费的代价为Ci,现在需要安排一种招募方式,可以使得总花 ...

  2. 洛谷 - P4016 负载平衡问题(最小费用最大流)

    题目链接:点击查看 题目大意:有n个仓库分布在一个环形的区域,现在每个仓库可以与相邻的两个仓库转移货物,问最少需要操作多少次才能让每个仓库的货物都达到平衡 题目分析:达到平衡的意思其实就是都等于平均值 ...

  3. 洛谷 P2053 [SCOI2007]修车 网络流 最小费用最大流 Dinic+Spfa

    题目链接: https://www.luogu.com.cn/problem/P2053 思路参考博客: https://www.luogu.com.cn/blog/a23333/solution-p ...

  4. CodeForces - 863F Almost Permutation(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n个限制,每个限制分为两种类型: 1 l r val:区间[l,r]内的数都大于等于val 2 l r val:区间[l,r]内的数都小于等于val 并且规定每个数出 ...

  5. 洛谷 P3381 【模板】最小费用最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数\(N.M.S.T\) ...

  6. 洛谷 3381 【模板】最小费用最大流

    https://www.luogu.org/problem/show?pid=3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流 ...

  7. 洛谷P1251 餐巾计划问题 无汇源最小费用流

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

  8. 洛谷P3381 【模板】最小费用最大流

    传送门 费用流板子 细节真多--一个边的flow和点的flow分不清--还有往回减流的时候应该减去flow[t]-- 1 //minamoto 2 #include<iostream> 3 ...

  9. 洛谷 - P2770 航空路线问题(最大费用最大流+路径打印)

    题目链接:点击查看 题目大意:给出一个由n个点及m条边组成的无向图,现在要求从点1出发,到达点n,再回到点1,一路上经过尽可能多的点,并且保证除了起点和终点外的每个点至多只能经过一次,并输出路径 题目 ...

最新文章

  1. “不设边界”的云知声:从多场景AI芯片到视觉AI,誓要2019营收近3倍
  2. flash builder4.7 for Mac升级AIRSDK详解
  3. Python:为什么必须在方法定义和调用中明确使用'self'?
  4. 6 | Spatial-based GNN/convolution模型之MoNET
  5. 【Vue2.0】—过滤器(七)
  6. CST,CET,UTC,GMT,DST,Unix时间戳几种常见时间概述与关系(转)
  7. -lavutil -lavcodec -lavdevice -lavfilter -lavformat链接失败,换用-lffmpeg
  8. Atitit. IE8.0 显示本地图片预览解决方案 img.src=本地图片路径无效的解决方案
  9. 怎样实现EDIUS中素材小范围精确移动
  10. python面向对象程序设计实验_实验七 面向对象程序设计
  11. 加勒比海盗海盗不雅镜头_土豆,海盗和……编程?
  12. WORD中设置“选择性粘贴“—“无格式文本”的快捷键
  13. asterisk meetme 会议实现
  14. 【ELT.ZIP】OpenHarmony啃论文俱乐部——一文穿透多媒体过往前沿
  15. C语言编程中void什么意思,程序设计中遇到的void到底是什么意思
  16. 嵌入式软件开发为什么需要DevOps?
  17. 位运算 - 位运算基本操作
  18. c语言处理用户错误输入,C语言实现用户输入
  19. 大创学习记录(四)之yolov3代码学习
  20. win7修改本地连接 MTU值的方法

热门文章

  1. SpringAMQP--WorkQueue模型
  2. Curator实现分布式锁的基本原理-InterProcessMutex.acquire
  3. 构造方法注入和设值注入有什么区别?
  4. ActiveMQ入门-ActiveMQ环境搭建
  5. 方法引用_通过对象名引用成员方法
  6. MYBATIS 批量update 报错的问题
  7. SpringBoot高级消息-RabbitMQ运行机制
  8. AtomicStampedReference实现
  9. ubuntu/linux运行shell脚本sudo自动输入密码(亲测可以)
  10. Protobuf之proto文件编写规则