«问题描述:
一个餐厅在相继的N 天里,每天需用的餐巾数不尽相同。假设第i天需要ri块餐巾(i=1,
2,…,N)。餐厅可以购买新的餐巾,每块餐巾的费用为p分;或者把旧餐巾送到快洗部,
洗一块需m天,其费用为f 分;或者送到慢洗部,洗一块需n 天(n>m),其费用为s<f 分。
每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多
少块保存起来延期送洗。但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。
试设计一个算法为餐厅合理地安排好N 天中餐巾使用计划,使总的花费最小。
«编程任务:
编程找出一个最佳餐巾使用计划.
«数据输入:
由文件input.txt提供输入数据。文件第1 行有6 个正整数N,p,m,f,n,s。N 是要安排餐巾
使用计划的天数;p 是每块新餐巾的费用;m 是快洗部洗一块餐巾需用天数;f 是快洗部洗
一块餐巾需要的费用;n是慢洗部洗一块餐巾需用天数;s是慢洗部洗一块餐巾需要的费用。
接下来的N 行是餐厅在相继的N 天里,每天需用的餐巾数。
«结果输出:
程序运行结束时,将餐厅在相继的N 天里使用餐巾的最小总花费输出到文件output.txt
中。

建立源点S汇点T,并把每一天拆分为入点与出点,

以ai表示第i天需要的餐巾数量

S向每天的入点连一条容量ai,费用0的边表示新产生的脏餐巾数

每天的入点向下一天的入点连一条容量无限大,费用0的边表示转移到下一天的脏餐巾

每天的入点向m天后的出点连一条容量无限大,费用f的边表示送去快洗部洗餐巾

每天的入点向n天后的出点连一条容量无限大,费用s的边表示送去慢洗部洗餐巾

每天的出点向T连一条容量ai,费用0的边表示当天需要的干净餐巾

zwk费用流的实现细节解释在代码注释中

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int MAXN=;
const int maxn=;
const int INF=~0U>>;
long long int maxflow=,cost=;
int v[maxn],dis[maxn];
int r[maxn];
int S,T;
int N,p,m,f,n,s;
int tot=;
int pointer[maxn];
struct Edge
{
int to,next,cap,op,f,w;
Edge() {};
Edge(int b,int c,int nxt,int num,int flow,int weight) {to=b,cap=c,next=nxt,op=num^,f=flow,w=weight;}
}edge[MAXN];
inline void addedge(int a,int b,int c,int w1)
{
edge[tot]=Edge(b,c,pointer[a],tot,,w1);
pointer[a]=tot++;
edge[tot]=Edge(a,,pointer[b],tot,,-w1);
pointer[b]=tot++;
}
inline int aug(int x,int flow) //dfs搜增光路 flow代表当前dfs路径中剩余容量最小边的容量
{
if(x==T)
{
maxflow+=flow;
cost+=dis[S]*flow;
return flow;
}
v[x]=;
int l=flow;
for(int j=pointer[x];j!=-;j=edge[j].next)
{
int y=edge[j].to;
if(!v[y]&&edge[j].cap-edge[j].f&&dis[y]+edge[j].w==dis[x]) //距离标号满足要求代表走的这一步是目前情况下到达y的最短路其中的一步
{
int tmp=aug(y,min(l,edge[j].cap-edge[j].f)); //
edge[j].f+=tmp,edge[j^].f-=tmp,l-=tmp; //x-->y这条路分走了tmp大小的流量
if(!l) return flow; //到达x点的flow大小的流量被分完了就不必考虑x的其他子节点了
}
}
return flow-l;
}
inline bool modlabel()
{
int minh=INF;
rep(i,S,T)
{
if(v[i])
for(int j=pointer[i];j!=-;j=edge[j].next)
{
int y=edge[j].to;
if(edge[j].cap-edge[j].f>&&!v[y])
{
minh=min(minh,dis[y]+edge[j].w-dis[i]);
}
}
}
if(minh==INF) return ;
rep(i,S,T) if(v[i]) dis[i]+=minh; //利用距离标号控制最短路条件
return ;
}
inline void zwk()
{
do
{
do
{
rep(i,S,T) v[i]=;
}while(aug(S,INF));
}while(modlabel());
}
inline void init()
{
memset(pointer,-,sizeof(pointer));
scanf("%d%d%d%d%d%d",&N,&p,&m,&f,&n,&s);
S=;T=*N+;
int ri;
rep(i,,N)
{
scanf("%d",&ri);
addedge(S,i,ri,);
addedge(N+i,T,ri,);
addedge(S,N+i,INF,p);
if(i+m<=N) addedge(i,N+i+m,INF,f);
if(i+n<=N) addedge(i,N+i+n,INF,s);
if(i<N) addedge(i,i+,INF,);
}
}
int main()
{
freopen("napk10.in","r",stdin);
init();
zwk();
printf("%lld\n",cost);
return ;
}

餐巾计划问题 zwk费用流解法的更多相关文章

  1. 【Codevs1237&网络流24题餐巾计划】(费用流)

    题意:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同. 假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分: 或者把旧餐巾送到快洗部,洗一块需 ...

  2. [luoguP1251] 餐巾计划问题(费用流)

    传送门 模型 网络优化问题,用最小费用最大流解决. 实现 把每天分为二分图两个集合中的顶点Xi,Yi,建立附加源S汇T. 1.从S向每个Xi连一条容量为ri,费用为0的有向边. 2.从每个Yi向T连一 ...

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

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

  4. 【洛谷 P1251】 餐巾计划问题 (费用流)

    题目链接 我做的网络流24题里的第一题.. 想是不可能想到的,只能看题解. 首先,我们拆点,将一天拆成晚上和早上,每天晚上会受到脏餐巾(来源:当天早上用完的餐巾,在这道题中可理解为从原点获得),每天早 ...

  5. 线性规划费用流解法(Bzoj1061: [Noi2008]志愿者招募)

    题面 传送门 Sol 线性规划费用流解法用与求解未知数为非负数的问题 这道题可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我们强行给每个式子减去一个东西, ...

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

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

  7. 刷题总结——学姐的逛街计划(vijos1891费用流)

    题目: doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪学姐去逛街呢. 后来, ...

  8. P1251-餐巾计划问题【费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P1251 题目大意 \(N\)天,第\(i\)天需要\(a_i\)个餐巾. 每个餐巾价格为\(p\),使用完后有两种 ...

  9. P4480 「BJWC2018」「网络流与线性规划24题」餐巾计划问题

    刷了n次用了奇淫技巧才拿到rk1,亥 这道题是网络流二十四题中「餐巾计划问题」的加强版. 于是怀着试一试的心情用费用流交了一发: 哇塞,过了9个点!(强烈谴责出题人用*造数据 下面是费用流解法简述: ...

随机推荐

  1. Maven依赖标红线,非jar包冲突问题

    Maven依赖标红线 在pom中引入依赖fastdfs-client时,该依赖可以正常引入,但是查看Maven Project时,该依赖下总是有几个依赖报红线,并不是依赖冲突,测试代码无法正常运行.想 ...

  2. [CodeForces - 447B] B - DZY Loves Strings

    B - DZY Loves Strings DZY loves collecting special strings which only contain lowercase letters. For ...

  3. IntelliJ IDEA下载及安装,破解

    IntelliJ IDEA下载及安装,破解 百度百科:IDEA 全称IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助 ...

  4. Xshell中文乱码怎么处理?

    改成如下图:

  5. MP3文件结构解析(超详细)

    转自:http://blog.csdn.net/u010650845/article/details/53520426 MP3文件结构解析(超详细) 1. MP3文件结构解析 1.1. 概述 1.1. ...

  6. jQuery获取select值

    jQuery操作select标签 即控制select的option属性 <select id="sid" > <option value="-1&quo ...

  7. latex 公式距离

    \setlength{\abovedisplayshortskip}{0cm} 公式和文本之间的间距 \setlength{\belowdisplayshortskip}{0cm} \setlengt ...

  8. linux因勿删或误操作导致登录界面异常,命令无法使用,显示/bin/bash:No such file or directory

    一.故障现象 1.用secure CRT连接服务器时显示: /bin/bash:No such file or directory 翻译成中文是:没有此类文件或目录 2.直接登录服务器执行命令时显示: ...

  9. urllib 获取页面或发送信息

    #! /usr/bin/env python3 # -*- coding:utf-8 -*- #urllib提供了一系列用于操作URL的功能. #urllib的request模块可以非常方便地抓取UR ...

  10. Android : apk签名的多种方法以及key的配置

    方法一:使用Android SDK中的签名工具给apk签名: (1)Android源码的 build/target/product/security/ 目录下有 media.pk8.media.x50 ...