相关知识:最小费用(最大)流

问题描述:
一个餐厅在相继的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了。

View Code

#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 费用流相关推荐

  1. 费用流 ---- P1251 餐巾计划问题[拆点](网络流24题)

    题目链接 题目大意: 解题思路 将脏餐巾以f元/条送到快洗部,过m天后,干净餐巾送回来使用 将脏餐巾以s元/条送到慢洗部,过n天后,干净餐巾送回来使用 延期送洗(可能会出现之后餐巾需求过少,并不需要所 ...

  2. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

  3. 囧——线性规划与网络流24题之网络流入门经典

    搞了好久终于搞定线性规划与网络流24题,不过机器人路径至今无解,第22题感觉是数据错了~~~ 我的代码,数据和题目题解是BYVoid那弄到的:http://download.csdn.net/sour ...

  4. [线性规划与网络流24题] 网络流常见模型

    最近两个月在做<线性规划与网络流24题>这套题,加深了对网络流的理解. 涵盖到的模型有:二分图匹配.二分图的最大独立集.最大权闭合图.有向无环图的最小路径覆盖.最多不相交路径.最大权不相交 ...

  5. 【线性规划与网络流24题】孤岛营救问题 分层图

    孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军 ...

  6. 【线性规划与网络流24题】汽车加油行驶问题 分层图

    汽车加油行驶问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 给定一个 N*N的方形网格,设其左上角为起点◎,坐标为( 1,1),X轴向右为 ...

  7. 【线性规划和网络流24题】

    (1)飞行员配对方案问题:二分图最大匹配. 思路:略. View Code 1 #include<cstdio> 2 #include<cstring> 3 #define M ...

  8. 线性规划与网络流24题 运输问题(最裸的费用流了)

    存费用流模板 用sfpa算出最小费用和路径,沿这条路径增广 1 const 2 inf=maxlongint; 3 var 4 n,m:longint; 5 map,a,w:array[0..120, ...

  9. 题解:线性规划与网络流24题 T2 太空飞行计划问题

    太空飞行计划问题 问题描述 W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要 ...

最新文章

  1. Machine Learning week 7 quiz: Unsupervised Learning
  2. Windows7下Caffe-SSD的应用(一)——在Windosw7下编译配置Caffe-SSD CPU版本
  3. 关于印发《会计电算化管理办法》等规章的通知
  4. Linux expect与Shell交互
  5. 文件系统管理相关命令
  6. 【OpenCV 例程200篇】49. 图像增强—局部直方图处理
  7. Celery参数详解、配置参数
  8. 局域网共享设置——权限问题
  9. javascript数据结构之队列
  10. springboot开发者工具包,自动监听内容改变,自动更新重启
  11. C++后台开发技术栈
  12. 美团饿了吗CPS红包,别人领红包下单,你拿推广佣金(附源码)
  13. 大佬们抖音带货流水都过亿 普通人有什么抖音变现的好方式
  14. 中国的漫威,还很遥远么
  15. Python:whl安装包简介与制作
  16. Redis: Redis的主从复制(Master/Slave),一主二仆,薪火相传,反客为主,哨兵模式sentinel
  17. 超越Java:Python正式登顶世界第一编程语言
  18. WebSocket 通信协议
  19. php导出1万条数据excel_PHP快速导出百万级数据到CSV或者EXCEL文件
  20. 毛细管计算长度软件(经验公式)

热门文章

  1. Git提交到多个远程仓库(多看两个文档)
  2. 当RxJava遇到AOP
  3. 如果遇到Hadoop集群正常,MapReduce作业运行出现错误,如何来查看作业运行日志(图文详解)...
  4. WeX5 -- xcode7+iphone免费帐号打包详解
  5. 比买电脑还便宜的桌面虚拟化方案
  6. 老司机 iOS 周报 #24 | 2018-06-25
  7. 软件需求管理用例方法三
  8. Shuffle 相关
  9. 浅谈java内存分配和回收策略
  10. 运维经验分享:关于系统运维监控的几点建议