题目链接

/*
每一天的餐巾需求相当于必须遍历某些点若干次
设q[i]为Dayi需求量 (x,y)表示边x容y费
将每个点i拆成i,i',由i'->T连(q[i],0)的边,表示求最大流的话一定要流满q[i]
对于i,由S->i连(q[i],0)的边,表示满足Dayi需求后最多还能给出q[i]块餐巾(感觉INF好像also ok?)
对于三种方式:
购买(花p买一块餐巾): 由S->i'连(INF,p),表示可以直接花p供给Dayi的需求
送到快洗部(a天洗完 每块花b): 由i->(i'+a)连(INF,b),表示给以一块花b供给Day(i+a)
送到慢洗部(c天洗完 每块花d): 由i->(i'+c)连(INF,d),表示给以一块花d供给Day(i+c)
注意某天的餐巾可以留到下一天,所以i->i+1连(INF,0)(也可以i'->(i+1)')
也可以贪心+三分...
注意数据(流量)比较大要longlong
*/
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define gc() getchar()
typedef long long LL;
const int N=5000,M=6*N,INF=0x3f3f3f3f; int n,m,src,des,dis[N],pre[N];
int Enum,H[N],nxt[M<<1],fr[M<<1],to[M<<1],cap[M<<1],cost[M<<1];
bool inq[N];
std::queue<int> q; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline void AddEdge(int u,int v,int w,int c)
{
to[++Enum]=v, fr[Enum]=u, cap[Enum]=w, cost[Enum]=c, nxt[Enum]=H[u], H[u]=Enum;
to[++Enum]=u, fr[Enum]=v, cap[Enum]=0, cost[Enum]=-c, nxt[Enum]=H[v], H[v]=Enum;
}
bool SPFA()
{
memset(dis,0x3f,sizeof dis);
dis[src]=0, q.push(src);
while(!q.empty())
{
int x=q.front();q.pop();
inq[x]=0;
for(int i=H[x];i;i=nxt[i])
if(cap[i] && dis[to[i]]>dis[x]+cost[i])
{
dis[to[i]]=dis[x]+cost[i], pre[to[i]]=i;
if(!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);
}
}
return dis[des]<INF;
}
LL MCMF()
{
int mn=INF; LL c=0;
for(int i=des;i!=src;i=fr[pre[i]])
mn=std::min(mn,cap[pre[i]]);
for(int i=des;i!=src;i=fr[pre[i]])
cap[pre[i]]-=mn,cap[pre[i]^1]+=mn,c+=1LL*mn*cost[pre[i]];
return c;
} int main()
{
Enum=1;
n=read();
src=0, des=n<<1|1;
for(int a,i=1;i<=n;++i)
a=read(),AddEdge(src,i,a,0),AddEdge(i+n,des,a,0);
int p=read(),a=read(),b=read(),c=read(),d=read();
for(int i=1;i<=n;++i) AddEdge(src,i+n,INF,p);
for(int i=1;i<n;++i) AddEdge(i,i+1,INF,0);
for(int i=1;i<=n-a;++i) AddEdge(i,i+n+a,INF,b);
for(int i=1;i<=n-c;++i) AddEdge(i,i+n+c,INF,d);
LL res=0;
while(SPFA()) res+=MCMF();
printf("%lld",res); return 0;
}

洛谷.1251.餐巾计划问题(费用流SPFA)的更多相关文章

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

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

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

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

  3. LuoguP1251 餐巾计划问题(费用流)

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

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

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

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

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

  6. 洛谷 1004 dp或最大费用流

    思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...

  7. 洛谷 P1251 餐巾计划问题

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

  8. 洛谷P4003 无限之环(费用流)

    传送门 神仙题啊……不看题解我可能一年都不一定做得出来……FlashHu大佬太强啦 到底是得有怎样的脑回路才能一眼看去就是费用流啊…… 建好图之后套个板子就好了,那么我们着重来讨论一下怎么建图 首先, ...

  9. 洛谷P4012 深海机器人问题(费用流)

    题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...

随机推荐

  1. STM32F103X datasheet学习笔记---DMA

    1.前言 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输. 无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作. 两个DMA控制器 ...

  2. V4L2学习记录【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637600.html V4L2学习记录 这个还没有分析完,先在这放着,防止电脑坏掉丢了,以后再完善 V4L ...

  3. C#实现图片叠加,图片上嵌入文字,文字生成图片的方法

    /// <summary>     /// 图片叠加     /// </summary>     /// <param name="sender"& ...

  4. centos中selinux功能及常用服务配置

    SELinux: Secure Enhenced Linux 常用命令 获取selinux的当前状态: # getenforce 临时启用或禁用: # setenfoce 0|1 永久性启用,需要修改 ...

  5. jmeter之beanshell取出需要参数,传递给下个请求

    jmeter之beanshell取出需要参数,传递给下个请求 事件背景: 上周同事用jmeter录制脚本,录制成功回放后,并没有达到自己想要的结果. ps:他想从数据库取出某个字段值,然后对数据库做操 ...

  6. nodejs服务器读取图片返回给前端(浏览器)显示

    1 前言 项目需要用nodejs服务器给前端传递图片,网上找了好多资料,多数都是怎么在前端上传图片的,然后通过看runoob.com菜鸟教程,发现其实是非常简单,用express框架就行了. 2 代码 ...

  7. gulp自动化构建教程

    gulp及gulpfile.js编写示例    本文主要记录一个gulpfile.js示例,以免以后用的时候遗忘.但首先还是要了解gulp是什么以及如何使用. 一.什么是gulp 简单来说:就是压缩前 ...

  8. vue系列之webpack

    webpack 地址: https://github.com/vuejs-templates/webpack 注意里面的template,用webpack创建的项目,结构就是这样的

  9. poj2992 阶乘分解

    /* 将C(n,k)质因数分解,然后约束个数按公式计算 */ #include<iostream> #include<cstring> #include<cstdio&g ...

  10. hdu3486 ST表区间最值+二分

    还是挺简单的,但是区间处理的时候要注意一下 #include<iostream> #include<cstring> #include<cstdio> #inclu ...