网络流二十四题之十 —— 餐巾计划问题(NAPK)
来源:互联网 发布:吉林大学网络教学平台 编辑:程序博客网 时间:2024/06/04 13:35
餐巾计划问题
Description
一个餐厅在相继的
假设第
餐厅可以购买新的餐巾,每块餐巾的费用为
或者把旧餐巾送到快洗部,洗一块需
或者送到慢洗部,洗一块需
每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。
但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。
试设计一个算法为餐厅合理地安排好
编程找出一个最佳餐巾使用计划。
Input
第
接下来的
Output
将餐厅在相继的
Solution
本题要把握的一点,就是每天生产出来的脏餐巾是固定的——即每天需用的餐斤数。
这样,我们就可以这样构图:
我们将使用餐巾和生产脏餐巾分为两个不同的板块。
因为限制条件为每天需要用一定数目的餐巾,所以在“使用餐巾”这个版块中,我们将每一天都连一条容量为每天需用的餐巾数的边到汇点。
从源点向“生产脏餐巾”的板块提供原料:从源点向每天连一条容量为每天需用的餐巾数的边。
生产出脏餐巾后,连一条容量为无限的边到送往快洗部洗完之后的那一天,费用设置为快洗的费用;连一条容量为无限的边到送往慢洗部洗完之后的那一天,费用设置为慢洗的费用。
另外,可以当天的餐巾不洗,留到第二天或永远不洗,那么我们还需要从每一天向其之后的那一天连一条容量为无限,费用为
最后求最小费用最大流即可。
因为是最大流,所以除了容量为无限的边之外,其它的边均为满流,满足题目条件。
Code
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #define Min(x,y) ((x)<(y)?(x):(y))
- #define MAXN 1000010
- #define MAXE 100010
- #define INF 0x3f3f3f3f
- #define ss 0
- #define tt 100005
- using namespace std;
- int N,p,m,f,n,s,ans;
- int cnt;
- int nxt[MAXN],data[MAXN],wei[MAXN],flow[MAXN],from[MAXN];
- int head[MAXE],dis[MAXE];
- int pre[MAXE];
- bool in_stack[MAXE];
- queue<int>q;
- void add(int x,int y,int a,int b){
- from[cnt]=x;nxt[cnt]=head[x];data[cnt]=y;wei[cnt]=b;flow[cnt]=a;head[x]=cnt++;
- from[cnt]=y;nxt[cnt]=head[y];data[cnt]=x;wei[cnt]=-b;flow[cnt]=0;head[y]=cnt++;
- }
- bool BFS(){
- memset(dis,0x3f,sizeof dis);
- q.push(ss);dis[ss]=0;in_stack[ss]=true;
- pre[ss]=pre[tt]=-1;
- while(!q.empty()){
- int now=q.front();
- q.pop();
- in_stack[now]=false;
- for(int i=head[now];i!=-1;i=nxt[i]){
- if(flow[i]&&wei[i]+dis[now]<dis[data[i]]){
- dis[data[i]]=wei[i]+dis[now];
- pre[data[i]]=(i^1);
- if(!in_stack[data[i]]){q.push(data[i]);in_stack[data[i]]=true;}
- }
- }
- }
- return pre[tt]>0;
- }
- void dfs(){
- int Low=INF;
- for(int i=pre[tt];i!=-1;i=pre[data[i]])Low=Min(Low,flow[i^1]);
- for(int i=pre[tt];i!=-1;i=pre[data[i]]){
- flow[i^1]-=Low;
- flow[i]+=Low;
- }
- }
- int main(){
- memset(head,-1,sizeof head);
- scanf(”%d%d%d%d%d%d”,&N,&p,&m,&f,&n,&s);
- for(int i=1;i<=N;i++){
- int x;
- scanf(”%d”,&x);
- add(i+N,tt,x,0);
- add(ss,i,x,0);
- if(i+m<=N)add(i,i+N+m,INF,f);
- if(i+n<=N)add(i,i+N+n,INF,s);
- if(i!=N)add(i,i+1,INF,0);
- add(ss,i+N,INF,p);
- }
- while(BFS())dfs();
- for(int i=0;i<cnt;i++){
- if(from[i]>=1&&from[i]<=N&&data[i]>=N+1&&data[i]!=tt&&data[i]!=ss)ans+=flow[i^1]*wei[i];
- if(from[i]==ss&&data[i]>=N+1&&data[i]!=tt&&data[i]!=ss)ans+=flow[i^1]*wei[i];
- }
- printf(”%d\n”,ans);
- return 0;
- }
- 网络流二十四题之十 —— 餐巾计划问题(NAPK)
- 网络流二十四题之二 —— 太空飞行计划问题(SHUT)
- 餐巾计划问题[网络流24题之10]
- 网络流与线性规划24题 之 餐巾计划问题
- 网络流24题之T10 餐巾计划问题
- 网络流二十四题之十 —— 星际转移问题(HOME)
- 【网络流24题】餐巾计划问题
- [网络流24题]餐巾计划问题
- 网络流24题 餐巾计划问题
- 网络流24题:餐巾计划问题
- [网络流 24 题] 餐巾计划问题
- 线性规划与网络流24——餐巾计划问题
- 网络流二十四题之二十 —— 深海机器人问题
- 网络流二十四题之二十四 —— 骑士共存问题(KNI)
- 洛谷P1251:网络流24题——餐巾计划问题
- 费用流+构图——Luogu1251 [网络流24题]餐巾计划问题([HNOI2001]软件开发)
- 网络流二十四题之十四 —— 孤岛营救问题(RESCUE)
- 网络流24题 餐巾计划问题 zkw费用流
- excel导入导出
- Syntax error, parameterized types are only available if source level is 1.5 解决方案
- [二维线段树] BZOJ 1513 [POI2006]Tet-Tetris 3D
- Matlab 内存管理
- 一种自动反射消息类型的 Google Protobuf 网络传输方案
- 网络流二十四题之十 —— 餐巾计划问题(NAPK)
- Android 动画详解
- 三分查找
- bzoj 1283(线性规划)
- HDU 2586 How far away ? 离线LCA
- ListView常用技巧及优化
- uva 10902 Pick-up Sticks
- 虚拟机的网络连接
- 用protobuf定义消息及处理