餐巾计划问题 线性规划与网络流24题之10 费用流
相关知识:最小费用(最大)流
问题描述:
一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同。 假设第i天需要ri块餐巾(i=1,
2,…,N)。餐厅可以购买新的餐巾,每块餐巾的费用为p分;或者把旧餐巾送到快洗部,
洗一块需 m天,其费用为 f 分;或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s<f 分。
每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多
少块保存起来延期送洗。 但是每天洗好的餐巾和购买的新餐巾数之和, 要满足当天的需求量。
试设计一个算法为餐厅合理地安排好N 天中餐巾使用计划,使总的花费最小。
问题分析:
题目要求每天的餐巾够用,因此算法中的最大流已经确定,一天之中餐巾的来源可以是新买来的,快洗或是慢洗到这一天刚好洗完的;而每天用完的餐巾则是送去快洗或慢洗,或留到下一天统一处理,
然后就是要把每天需要用的和用完的分开处理,这样就有了一个二分图模型。Xi表示第i天需要用的餐巾数量, 二分图X集合中顶点Xi表示第i天用完的餐巾,其数量为ri,所以从S向Xi连接容量为ri的边作为限制。Y集合中每个点Yi则是第i天需要的餐巾,数量为ri,与T连接的边容量作为限制。每天用完的餐巾可以选择留到下一天(Xi->Xi+1),不需要花费,送到快洗部(Xi->Yi+m),费用为f,送到慢洗部(Xi->Yi+n),费用为s。每天需要的餐巾除了刚刚洗好的餐巾,还可能是新购买的(S->Yi),费用为p。
具体连边方法:
把每天分为二分图两个集合中的顶点Xi,Yi,建立附加源S汇T。
1、从S向每个Xi连一条容量为ri,费用为0的有向边。//表示每天最多用ri餐巾
2、从每个Yi向T连一条容量为ri,费用为0的有向边。//同上
3、从S向每个Yi连一条容量为无穷大,费用为p的有向边。//Yi天新买的餐巾
4、从每个Xi向Xi+1(i+1<=N)连一条容量为无穷大,费用为0的有向边。//留到下一天处理
5、从每个Xi向Yi+m(i+m<=N)连一条容量为无穷大,费用为f的有向边。//慢洗,到i+m天才能用
6、从每个Xi向Yi+n(i+n<=N)连一条容量为无穷大,费用为s的有向边。//快洗,到i+n天才能用
这样一个费用流就出现了。只要y点集合与T点连接的边全部满流,而且保证总费用最小,这题就AC了。
#include<cstdio>#include<queue>#include<cstdlib>#include<cstring>#include<iostream>using namespace std;#define MaxN 210#define INF 2000000struct atp{int y,x,flow,cost;int op,next; }e[MaxN];queue<int> q;int n,Newcost,kt,kc,mt,mc,s,t,tot,ans;int first[MaxN],pre[MaxN],pe[MaxN],d[MaxN];bool b[MaxN];void add(int x,int y,int flow,int cost){ tot++; e[tot].y=y; e[tot].x=x; e[tot].flow=flow; e[tot].cost=cost; e[tot].op=tot+1; e[tot].next=first[x]; first[x]=tot; tot++; e[tot].y=x; e[tot].x=y; e[tot].flow=0; e[tot].cost=cost; e[tot].op=tot-1; e[tot].next=first[y]; first[y]=tot; } void init(){int x; scanf("%d%d%d%d%d%d",&n,&Newcost,&kt,&kc,&mt,&mc); s=0;t=n+n+n;for (int i=1;i<=n;i++) { scanf("%d",&x); add(s,i,x,0); add(n+i,t,x,0); add(s,n+i,INF,Newcost);if (i<n) add(i,i+1,INF,0);if (i+kt<=n) add(i,i+n+kt,INF,kc);if (i+mt<=n) add(i,i+n+mt,INF,mc); } } bool spfa(){ memset(b,false,sizeof(b)); memset(d,100,sizeof(d));int INFF=d[1];while (!q.empty()) q.pop(); b[s]=true; d[s]=0; q.push(s);while (!q.empty()) {int u=q.front();for (int p=first[u];p;p=e[p].next) {if (d[u]+e[p].cost<d[e[p].y] && e[p].flow>0) { d[e[p].y]=d[u]+e[p].cost; pre[e[p].y]=p;if (!b[e[p].y]) { b[e[p].y]=true; q.push(e[p].y); } } } b[u]=false; q.pop(); }if (d[t]==INFF) return false; else return true; }void work(){int Minflow=INF,i,tt; i=t;while (i!=s) { tt=pre[i];if (e[tt].flow<Minflow) Minflow=e[tt].flow; i=e[tt].x; } i=t;for (int i=t;i!=s;i=e[tt].x);while (i!=s) { tt=pre[i]; e[tt].flow-=Minflow; e[e[tt].op].flow+=Minflow; ans+=Minflow*e[tt].cost; i=e[tt].x; } }int main(){ init();while (spfa()) work(); printf("%d",ans);// system("pause"); return 0; }
转载于:https://www.cnblogs.com/evan-oi/archive/2012/02/03/2337346.html
餐巾计划问题 线性规划与网络流24题之10 费用流相关推荐
- 费用流 ---- P1251 餐巾计划问题[拆点](网络流24题)
题目链接 题目大意: 解题思路 将脏餐巾以f元/条送到快洗部,过m天后,干净餐巾送回来使用 将脏餐巾以s元/条送到慢洗部,过n天后,干净餐巾送回来使用 延期送洗(可能会出现之后餐巾需求过少,并不需要所 ...
- 解题报告:线性规划与网络流24题
目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...
- 囧——线性规划与网络流24题之网络流入门经典
搞了好久终于搞定线性规划与网络流24题,不过机器人路径至今无解,第22题感觉是数据错了~~~ 我的代码,数据和题目题解是BYVoid那弄到的:http://download.csdn.net/sour ...
- [线性规划与网络流24题] 网络流常见模型
最近两个月在做<线性规划与网络流24题>这套题,加深了对网络流的理解. 涵盖到的模型有:二分图匹配.二分图的最大独立集.最大权闭合图.有向无环图的最小路径覆盖.最多不相交路径.最大权不相交 ...
- 【线性规划与网络流24题】孤岛营救问题 分层图
孤岛营救问题 Time Limit: 1 Sec Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军 ...
- 【线性规划与网络流24题】汽车加油行驶问题 分层图
汽车加油行驶问题 Time Limit: 1 Sec Memory Limit: 128 MB Description 给定一个 N*N的方形网格,设其左上角为起点◎,坐标为( 1,1),X轴向右为 ...
- 【线性规划和网络流24题】
(1)飞行员配对方案问题:二分图最大匹配. 思路:略. View Code 1 #include<cstdio> 2 #include<cstring> 3 #define M ...
- 线性规划与网络流24题 运输问题(最裸的费用流了)
存费用流模板 用sfpa算出最小费用和路径,沿这条路径增广 1 const 2 inf=maxlongint; 3 var 4 n,m:longint; 5 map,a,w:array[0..120, ...
- 题解:线性规划与网络流24题 T2 太空飞行计划问题
太空飞行计划问题 问题描述 W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要 ...
最新文章
- Machine Learning week 7 quiz: Unsupervised Learning
- Windows7下Caffe-SSD的应用(一)——在Windosw7下编译配置Caffe-SSD CPU版本
- 关于印发《会计电算化管理办法》等规章的通知
- Linux expect与Shell交互
- 文件系统管理相关命令
- 【OpenCV 例程200篇】49. 图像增强—局部直方图处理
- Celery参数详解、配置参数
- 局域网共享设置——权限问题
- javascript数据结构之队列
- springboot开发者工具包,自动监听内容改变,自动更新重启
- C++后台开发技术栈
- 美团饿了吗CPS红包,别人领红包下单,你拿推广佣金(附源码)
- 大佬们抖音带货流水都过亿 普通人有什么抖音变现的好方式
- 中国的漫威,还很遥远么
- Python:whl安装包简介与制作
- Redis: Redis的主从复制(Master/Slave),一主二仆,薪火相传,反客为主,哨兵模式sentinel
- 超越Java:Python正式登顶世界第一编程语言
- WebSocket 通信协议
- php导出1万条数据excel_PHP快速导出百万级数据到CSV或者EXCEL文件
- 毛细管计算长度软件(经验公式)