洛谷P1251 餐巾计划问题(费用流)
不得不说这题真是思路清奇,真是网络流的一道好题,完全没想到网络流的建图还可以这么建
我们把每一个点拆成两个点,分别表示白天和晚上,白天可以得到干净的餐巾(购买的,慢洗的,快洗的),晚上可以得到脏餐巾(之前剩下的,今天用过的)
1.每一天,我们都从源点向晚上连边,容量为餐巾,费用$0$,表示可以免费获得这么多餐巾,从早上想汇点连边,容量为餐巾,费用为$0$,表示可以免费提供这么多餐巾,流满时表示当天餐巾够用
2.从每一天晚上向第二天晚上连边,容量$inf$,费用$0$,表示可以把脏餐巾留到第二天晚上(因为有可能有的餐巾不用洗第二天就已经够了)
3.在每一天晚上向这一天的$t1$天之后的早上连容量为$inf$,费用快洗钱数的边,表示每天晚上可以快洗之后为$t1$天之后送去干净的餐巾
4.在每一天晚上向这一天的$t2$天之后的早上连容量为$inf$,费用慢洗钱数的边,表示每天晚上可以慢洗之后为$t2$天之后送去干净的餐巾
5.从起点向每一天早上连容量$inf$,费用为买餐巾费用的边,表示每天早上都可以买餐巾
ps:后四点建边时要判断是否合法
然后为了让每天早上餐巾都够用,得让网络流满,所以跑一个最小费用最大流即可
- //minamoto
- #include<iostream>
- #include<cstdio>
- #include<queue>
- #include<cstring>
- #define inf 0x3f3f3f3f
- #define ll long long
- using namespace std;
- #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
- char buf[<<],*p1=buf,*p2=buf;
- inline int read(){
- #define num ch-'0'
- char ch;bool flag=;int res;
- while(!isdigit(ch=getc()))
- (ch=='-')&&(flag=true);
- for(res=num;isdigit(ch=getc());res=res*+num);
- (flag)&&(res=-res);
- #undef num
- return res;
- }
- const int N=,M=;
- int ver[M],Next[M],head[N],edge[M],flow[M],tot=;
- int disf[N],vis[N],Pre[N],last[N];ll dis[N];
- int n,m,t1,t2,m1,m2,s,t;
- queue<int> q;
- inline void add(int u,int v,int f,int e){
- ver[++tot]=v,Next[tot]=head[u],head[u]=tot,flow[tot]=f,edge[tot]=e;
- ver[++tot]=u,Next[tot]=head[v],head[v]=tot,flow[tot]=,edge[tot]=-e;
- }
- bool spfa(){
- memset(dis,0x3f,sizeof(dis));
- q.push(s),dis[s]=,disf[s]=inf,Pre[t]=-;
- while(!q.empty()){
- int u=q.front();q.pop();vis[u]=;
- for(int i=head[u];i;i=Next[i]){
- int v=ver[i];
- if(flow[i]&&dis[v]>dis[u]+edge[i]){
- dis[v]=dis[u]+edge[i],last[v]=i,Pre[v]=u;
- disf[v]=min(disf[u],flow[i]);
- if(!vis[v]) vis[v]=,q.push(v);
- }
- }
- }
- return ~Pre[t];
- }
- ll dinic(){
- ll mincost=;
- while(spfa()){
- int u=t;mincost+=disf[t]*dis[t];
- while(u!=s){
- flow[last[u]]-=disf[t];
- flow[last[u]^]+=disf[t];
- u=Pre[u];
- }
- }
- return mincost;
- }
- int main(){
- n=read();
- s=,t=*n+;
- for(int i=;i<=n;++i){
- int x=read();
- add(s,i,x,),add(i+n,t,x,);
- }
- m=read(),t1=read(),m1=read(),t2=read(),m2=read();
- for(int i=;i<=n;++i){
- if(i+<=n) add(i,i+,inf,);
- if(i+t1<=n) add(i,i+n+t1,inf,m1);
- if(i+t2<=n) add(i,i+n+t2,inf,m2);
- add(s,i+n,inf,m);
- }
- printf("%lld\n",dinic());
- return ;
- }
洛谷P1251 餐巾计划问题(费用流)的更多相关文章
- 洛谷.1251.餐巾计划问题(费用流SPFA)
题目链接 /* 每一天的餐巾需求相当于必须遍历某些点若干次 设q[i]为Dayi需求量 (x,y)表示边x容y费 将每个点i拆成i,i',由i'->T连(q[i],0)的边,表示求最大流的话一定 ...
- 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】
(题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...
- 洛谷P1251 餐巾计划问题(最小费用最大流)
题意 一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径 1.以$p$的费用买 2.以$f$的费用送到快洗部,并在$m$天后取出 3.以$s$的费用送到慢洗部,并在$n$天后取出 问满足 ...
- [洛谷P1251]餐巾计划问题
题目大意:一个餐厅N天,每天需要$r_i$块餐巾.每块餐巾需要p元,每天用过的餐巾变脏,不能直接用.现在有快洗店和慢洗店,快洗店洗餐巾需要m天,每块花费f元:慢洗店洗餐巾需要n天,每块餐巾s元(m & ...
- 洛谷 P1251 餐巾计划问题
题目链接 最小费用最大流. 每天拆成两个点,早上和晚上: 晚上可以获得\(r_i\)条脏毛巾,从源点连一条容量为\(r_i\),费用为0的边. 早上要供应\(r_i\)条毛巾,连向汇点一条容量为\(r ...
- 洛谷 P1251 餐巾计划问题【最小费用最大流】
建图细节比较多,对于每个点i,拆成i和i',i表示用的餐巾,i'表示脏餐巾,连接: (s,i,r[i],p)表示在这一天买新餐巾 (i,t,r[i],0)表示这一天用了r[i]的餐巾 (s,i+n,r ...
- P1251 餐巾计划问题 费用流
https://www.luogu.org/problemnew/show/P1251 题意 有一家酒店,酒店每天需要ri张桌布,桌布可以现买,p元.可以通过快洗店,等m天,f元.可以通过慢洗店,等n ...
- LuoguP1251 餐巾计划问题(费用流)
题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...
- 洛谷P1251 餐巾(网络流)
P1251 餐巾 15通过 95提交 题目提供者该用户不存在 标签网络流贪心 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 为什么我全部10个测试点都对… 题目描述 一个餐厅在相继的N天里 ...
随机推荐
- js取得前2位字符
<label id="ab">0</label> <script language="javascript"> url=&q ...
- nginx反向代理负载均衡初次配置
反向代理,我个人理解是通过一台反向代理服务器,把客户端的把有请求按照一定的规则分发给后台的服务器.nginx作反向代理服务器的虚拟机配置如下: upstream itest { #正常情况下应该作如下 ...
- leetcode144
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...
- Element-UI使用基本介绍
Element-Ul是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是Mint UI . 开发环境 1.安装webpack npm install -g webp ...
- 【283】ArcMap 中河流字体设置
左斜字体的设置 1. 右键属性设置如下,将字体角度如下设置,并点击改变样式的按钮 2. 首先设置颜色如下,然后设置加粗斜体,最后勾选 CJK character orientation 的复选框 C ...
- 服务器发送邮件出现Could not connect to SMTP host错误 解决办法
服务器发送邮件出现Could not connect to SMTP host错误 解决办法 功夫不负有心人,最后了解到,除了google的smtp服务器收到请求“smtp”会接受,其他服务器比如qq ...
- oracle job SYSDATE
hr BEGIN SYS.DBMS_JOB.REMOVE(); COMMIT; END; / DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job =&g ...
- C# 文件打印
Process pr = new Process(); pr.StartInfo.FileName = “C:\test.xls”; ...
- Spring总结二:IOC(控制反转)xml方式
1,简介: IoC :Inverse of control 控制反转 ,思想就是在项目中引入一个工厂容器,对项目中接口依赖对象的创建,实现项目中对于依赖对象解耦合. 将程序中对象的创建权以及对象的整个 ...
- 关于使用sessionStorage报SecurityError错误的问题
localStorage 永久保存 不同页面和标签页可以共享 关闭浏览器不会清除 sessionStorage 会话保存 不同页面和标签页不能共享 关闭浏览器会清除 遇到的问题:在firefox中报S ...