洛谷 P1251 餐巾计划问题
最小费用最大流。
每天拆成两个点,早上和晚上;
晚上可以获得\(r_i\)条脏毛巾,从源点连一条容量为\(r_i\),费用为0的边。
早上要供应\(r_i\)条毛巾,连向汇点一条容量为\(r_i\)吗,费用为0的边。
每天可以买毛巾,晚上向第二天早上连一条费用为\(p\),容量为\(inf\)的边。
可以送快洗,晚上向\(m\)天之后的早上连费用\(f\),容量\(inf\)的边
可以送慢洗,晚上向\(n\)天之后的早上连费用\(s\),容量\(inf\)的边
脏毛巾可以留到第二天晚上,源点向第二天晚上连一条容量\(r_i\),费用0的边。
最后跑费用流即可。
常数巨大的代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);x*=f;
}
inline void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar((x%10)^48);
}
inline void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define maxn 1000050
int n,m,s,t,max_flow,tot=1,min_cost;
int head[maxn],dis[maxn],vis[maxn],v[70][70];
struct edge{int to,nxt,w,c;}e[maxn<<1];
void add(int u,int v,int w,int c) {e[++tot]=(edge){v,head[u],w,c},head[u]=tot;}
void ins(int u,int v,int w,int c) {add(u,v,w,c),add(v,u,0,-c);}
int spfa() {
memset(vis,0,sizeof vis);
memset(dis,63,sizeof dis);
queue<int > q;q.push(s);dis[s]=0;vis[s]=1;
while(!q.empty()) {
int now=q.front();q.pop();vis[now]=0;
for(int i=head[now];i;i=e[i].nxt)
if(e[i].w>0&&dis[e[i].to]>dis[now]+e[i].c) {
dis[e[i].to]=dis[now]+e[i].c;
if(!vis[e[i].to]) vis[e[i].to]=1,q.push(e[i].to);
}
}return dis[t]<1e9;
}
int dfs(int u,int f) {
if(u==t) {max_flow+=f,min_cost+=f*dis[t],vis[t]=1;return f;}
vis[u]=1;int used=0;
for(int i=head[u];i;i=e[i].nxt)
if(e[i].w>0&&dis[e[i].to]==dis[u]+e[i].c&&!vis[e[i].to]) {
int flow=dfs(e[i].to,min(f-used,e[i].w));
if(flow>0) {e[i].w-=flow,e[i^1].w+=flow;return flow;}
if(used==f) break;
}
return used;
}
void cost_flow() {
while(spfa()) {
vis[t]=1;
while(vis[t]) memset(vis,0,sizeof vis),dfs(s,1e9);
}
}
signed main() {
read(n);int x;s=0,t=n*2+1;
for(int i=1;i<=n;i++) read(x),ins(s,i,x,0),ins(i+n,t,x,0);
int p,m,f,nn,ss;read(p),read(m),read(f),read(nn),read(ss);
for(int i=1;i<=n;i++) {
ins(s,i+n,1e7,p);
if(i+m<=n) ins(i,i+m+n,1e7,f);
if(i+nn<=n) ins(i,i+nn+n,1e7,ss);
if(i+1<=n) ins(i,i+1,1e7,0);
}cost_flow();write(min_cost);
return 0;
}
洛谷 P1251 餐巾计划问题的更多相关文章
- 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】
(题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...
- 洛谷P1251 餐巾计划问题(费用流)
传送门 不得不说这题真是思路清奇,真是网络流的一道好题,完全没想到网络流的建图还可以这么建 我们把每一个点拆成两个点,分别表示白天和晚上,白天可以得到干净的餐巾(购买的,慢洗的,快洗的),晚上可以得到 ...
- [洛谷P1251]餐巾计划问题
题目大意:一个餐厅N天,每天需要$r_i$块餐巾.每块餐巾需要p元,每天用过的餐巾变脏,不能直接用.现在有快洗店和慢洗店,快洗店洗餐巾需要m天,每块花费f元:慢洗店洗餐巾需要n天,每块餐巾s元(m & ...
- 洛谷P1251 餐巾计划问题(最小费用最大流)
题意 一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径 1.以$p$的费用买 2.以$f$的费用送到快洗部,并在$m$天后取出 3.以$s$的费用送到慢洗部,并在$n$天后取出 问满足 ...
- 洛谷 P1251 餐巾计划问题【最小费用最大流】
建图细节比较多,对于每个点i,拆成i和i',i表示用的餐巾,i'表示脏餐巾,连接: (s,i,r[i],p)表示在这一天买新餐巾 (i,t,r[i],0)表示这一天用了r[i]的餐巾 (s,i+n,r ...
- 洛谷P1251 餐巾(网络流)
P1251 餐巾 15通过 95提交 题目提供者该用户不存在 标签网络流贪心 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 为什么我全部10个测试点都对… 题目描述 一个餐厅在相继的N天里 ...
- 洛谷 [P251] 餐巾计划问题
有上下界的最小费用最大流 可以联想到供求平衡问题,所以我们要拆点做这道题 把每天分为二分图两个集合中的顶点Xi,Yi,建立附加源S汇T. 1.从S向每个Xi连一条容量为ri,费用为0的有向边. 2.从 ...
- 洛谷.1251.餐巾计划问题(费用流SPFA)
题目链接 /* 每一天的餐巾需求相当于必须遍历某些点若干次 设q[i]为Dayi需求量 (x,y)表示边x容y费 将每个点i拆成i,i',由i'->T连(q[i],0)的边,表示求最大流的话一定 ...
- P1251 餐巾计划问题
P1251 餐巾计划问题 题目描述 一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 iii 天需要 rir_iri块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费 ...
随机推荐
- Document .load与Document .ready的区别
页面加载完成有两种事件 1.load是当页面所有资源全部加载完成后(包括DOM文档树,css文件,js文件,图片资源等),执行一个函数 问题:如果图片资源较多,加载时间较长,onload后等待执行的函 ...
- Centos6.5 安装python2.7.14
2018-06-30 因为Centos6.5系统默认使用,python2.6.6.最近在学python.老师推荐将2.6.6升级至2.7.14.所以以留此文,怕哪天脑子短路好回来看看... >1 ...
- ubuntu 14.04离线安装docker和docker compose
准备安装包 1.下载docker docker支持以下版本的ubuntu系统Artful 17.10 (Docker CE 17.11 Edge)Zesty 17.04Xenial 16.04 (LT ...
- hdu6370 并查集+dfs
Werewolf Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- css在线sprite
大家知道网站图片多,浏览器下载多个图片要有多个请求.可是请求比较耗时,那怎么办呢? 对,方法就是css sprite. 今天我们来看看css在线sprite 百度搜索css-sprite 打开www. ...
- HBase 通过myeclipce脚本来获取固定columns(获取列簇中的列及对应的value值)
第一步:关联Jar包 1. 配置hadoop-env.sh文件添加Hbase关联jar包 /opt/modules/hadoop-2.5.0-cdh5.3.6/etc/hadoop下编辑hadoop- ...
- linux ln 建立软链接-- 基于dubbo-zookeeper服务的 服务jar 引用公共的 lib
对于ln命令网上有很多的教程,这里不再复述, 其基本目的是:多个文件夹公用一个文件夹的里的文件. 其基本命令格式: ln [option] source_file dist_file (source_ ...
- 一步一步学Linq to sql(六):探究特性
延迟执行 IQueryable query = from c in ctx.Customers select c; 这样的查询句法不会导致语句立即执行,它仅仅是一个描述,对应一个SQL.仅仅在需要使用 ...
- Microsoft Security Essentials 和 Windows Defender 离线升级包下载地址
自从微软提供了免费的杀毒软件之后我就卸载掉了其他的杀毒软件.但是最近遇到了个小问题,我这里有一批电脑不能联网,杀毒软件的升级成了问题.在网上搜索了一番,终于找到了官方的离线升级包下载地址.放在这里备用 ...
- Ubuntu中搭建Hadoop集群(简记)
stp1:在Vmware虚拟机上创建Ubantu.2环境 步骤:文件—>新建虚拟机—>典型(下一步)—>下一步——>位置(不建议放c盘,文件地址一定要全英文)—>下一步— ...