题目大意:有一种商品X,其每每单位存放一个月的代价I固定。并且已知其每月的最大生产量、生产每单位的的代价、最大销售量和销售单价,还已知每个月生产的X能最多能存放的时间(以月为单位)。问只考虑前m个月,最多能获得多少利润。

题目分析:增加源点s和汇点t,将每一个月视作一个节点。建立图模型如下:将每一个节点拆成两个,即将v拆成v和v1,从s向所有的v连一条弧,容量为该月最大生产量,费用为该月的单位生产代价;然后从所有的v1出发连一条弧向t,容量为该月最大销售量,费用为销售单价的相反数;最后,从v出发向所有它能存放到的月数u对应的u1连一条弧,容量为正无穷大,费用为I*(u-v)。对该模型求最小费用最大流,显然,这里对最小费用取相反数便的最大利润。

代码如下:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<cmath>
  4. # include<string>
  5. # include<vector>
  6. # include<list>
  7. # include<set>
  8. # include<map>
  9. # include<queue>
  10. # include<cstring>
  11. # include<algorithm>
  12. using namespace std;
  13.  
  14. # define LL long long
  15. # define REP(i,s,n) for(int i=s;i<n;++i)
  16. # define CL(a,b) memset(a,b,sizeof(a))
  17. # define CLL(a,b,n) fill(a,a+n,b)
  18.  
  19. const double inf=1e30;
  20. const int INF=1<<30;
  21. const int N=300;
  22.  
  23. struct Edge
  24. {
  25. int fr,to;
  26. LL cap,flow,cost;
  27. Edge(int _fr,int _to,LL _cap,LL _flow,LL _cost):fr(_fr),to(_to),cap(_cap),flow(_flow),cost(_cost){}
  28. };
  29. vector<Edge>edges;
  30. vector<int>G[N];
  31. int p[N],inq[N],n,I;
  32. LL a[N],d[N];
  33.  
  34. void init()
  35. {
  36. edges.clear();
  37. REP(i,0,n) G[i].clear();
  38. }
  39.  
  40. void addEdge(int fr,int to,LL cap,LL cost)
  41. {
  42. edges.push_back(Edge(fr,to,cap,0,cost));
  43. edges.push_back(Edge(to,fr,0,0,-cost));
  44. int m=edges.size();
  45. G[fr].push_back(m-2);
  46. G[to].push_back(m-1);
  47. }
  48.  
  49. bool BellmanFord(int s,int t,LL &flow,LL &cost)
  50. {
  51. CL(inq,0);
  52. CLL(d,INF,n);
  53. d[s]=0,inq[s]=1,p[s]=0,a[s]=INF;
  54.  
  55. queue<int>q;
  56. q.push(s);
  57. while(!q.empty()){
  58. int u=q.front();
  59. q.pop();
  60. inq[u]=0;
  61. REP(i,0,G[u].size()){
  62. Edge &e=edges[G[u][i]];
  63. if(e.cap>e.flow&&d[e.to]>d[u]+e.cost){
  64. d[e.to]=d[u]+e.cost;
  65. p[e.to]=G[u][i];
  66. a[e.to]=min(a[u],e.cap-e.flow);
  67. if(!inq[e.to]){
  68. q.push(e.to);
  69. inq[e.to]=1;
  70. }
  71. }
  72. }
  73. }
  74. if(d[t]>0) return false;
  75. flow+=(LL)a[t];
  76. cost+=(LL)d[t]*(LL)a[t];
  77. for(int u=t;u!=s;u=edges[p[u]].fr){
  78. edges[p[u]].flow+=a[t];
  79. edges[p[u]^1].flow-=a[t];
  80. }
  81. return true;
  82. }
  83.  
  84. LL Mincost(int s,int t)
  85. {
  86. LL flow=0,cost=0;
  87. while(BellmanFord(s,t,flow,cost));
  88. return cost;
  89. }
  90.  
  91. struct X
  92. {
  93. int m,n,p,s,E;
  94. };
  95. X x[105];
  96.  
  97. int main()
  98. {
  99. int T,m,s,t,cas=0;
  100. scanf("%d",&T);
  101. while(T--)
  102. {
  103. scanf("%d%d",&m,&I);
  104. n=2*m+2;
  105. s=0,t=2*m+1;
  106. init();
  107. REP(i,1,m+1) scanf("%d%d%d%d%d",&x[i].m,&x[i].n,&x[i].p,&x[i].s,&x[i].E);
  108. REP(i,1,m+1){
  109. addEdge(0,2*i-1,x[i].n,x[i].m);
  110. addEdge(2*i,t,x[i].s,-x[i].p);
  111. }
  112. REP(i,1,m+1) REP(j,i,min(i+x[i].E,m)+1)
  113. addEdge(2*i-1,2*j,INF,I*(j-i));
  114. printf("Case %d: %lld\n",++cas,-Mincost(s,t));
  115. }
  116. return 0;
  117. }

  

UVA-11613 Acme Corporation (最大费用最大流+拆点)的更多相关文章

  1. UVa 1658 - Admiral(最小费用最大流 + 拆点)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. UVA 11613 Acme Corporation(不固定流量的最小费用流)

    题意好长....变量好多.... 增加源点跟汇点.然后将每个月份看成一个点,然后拆成两个点u 跟 u+n. 从s向每个u连一条<n[u], m[i]>的弧,表示最多生产量及价值. 从每个u ...

  3. UVa 10806 Dijkstra,Dijkstra(最小费用最大流)

    裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...

  4. UVA - 1658 Admiral (最小费用最大流)

    最短路对应费用,路径数量对应流量.为限制点经过次数,拆点为边.跑一次流量为2的最小费用最大流. 最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路. #include ...

  5. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图

    1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...

  6. UVa 1658 海军上将(最小费用最大流)

    https://vjudge.net/problem/UVA-1658 题意: 给出一个v个点e条边的有向加权图,求1~v的两条不相交(除了起点和终点外公共点)的路径,使得权和最小. 思路:把2到v- ...

  7. uva 1658 Admiral 【 最小费用最大流 】

    拆点,每个点拆成 i,i' 在i 和i‘之间连一条费用为0,容量为1的边,就可以保证每个点只经过一次 特殊的点,1和n之间,,,n和2*n之间连一条费用为0,容量为2的边,可以求出两条路径 #incl ...

  8. BZOJ-1877 晨跑 最小费用最大流+拆点

    其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...

  9. BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理

    准备一周多的期末,各种爆炸,回来后状态下滑巨快...调了一晚上+80%下午 2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MB ...

随机推荐

  1. Oracle等待事件之db file sequential read/ db file parallel read

    1.产生原因 db file sequential read这个是非常常见的I/O 相关的等待事件.表示发生了与索引扫描相关的等待.意味着I/O 出现了问题,通常表示I/O竞争或者I/O 需求太多. ...

  2. describe neural networks as a series of computational steps via a directed graph.

    https://www.microsoft.com/en-us/research/product/cognitive-toolkit/ https://github.com/microsoft/cnt ...

  3. vue - 计算属性、表单输入绑定

    计算属性 computed:{} <!DOCTYPE html> <html> <head> <title></title> </he ...

  4. python re.sub 括号匹配替换匹配到的内容后接数字

    如果代码为: text = re.sub(r'(?<=[{])([a-z]+)6(?=[}])', r'\13', text) 上面代码会报错,因为没有组合13,所以不能获得组合13的内容. 但 ...

  5. receive.denyCurrentBranch 推送错误解决

    场景: 1.搭建Ok了一git服务器 2.本机上的现有源码,现在想纳入git源码管理 操作: 1.服务器上创建了工程仓库 git init 2. 客户端使用tortoisegit添加并提交要纳入源码管 ...

  6. 让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求 The serverRuntime@appConcurrentRequestLimit setting is being exceeded.

    今天下午17点左右,博客园博客站点出现这样的错误信息: Error Summary: HTTP Error 503.2 - Service UnavailableThe serverRuntime@a ...

  7. CentOS7.5基础优化与常用配置

    目录 最小化全新安装CentOS7基础优化 配置yum源 安装常用软件 关闭防火墙 关闭SELinux 优化ulimit 历史命令记录改为1万条 把命令提示符改为绿色 添加vim配置文件 添加一个普通 ...

  8. Swagger生成的接口需要权限验证的处理方法

    通常开发API的时候需要对接口进行权限验证,而我们在使用Swagger生成接口文档界面的时候,直接调用需要权限验证的接口会提示"当前用户没有登陆" 为了解决此问题,我们需要更改一下 ...

  9. 查准率与查全率(precision and recall) 的个人理解

    假设要识别照片中的狗的,在一些照片中,包含12只狗的照片和一些猫的照片.算法识别出有8只狗.在确定的8只狗中,5只实际上是狗(真阳性TP),而其余的是猫(假阳性FP).该程序的精度为5/8,而其召回率 ...

  10. NiFi REST API 的使用

    一.概述 为方便用户使用 NiFi 进行二次开发,NiFi 为开发者提供了 NIFI REST API. 关于 API 的详细介绍,请参见官网 NIFI REST API.这里仅给出一些注意的小细节. ...