传送门

费用流入门题。


直接按照题意模拟。

把货物的数量当做容量建边。

然后跑一次最小费用流和最大费用流就行了。

代码:

  1. #include<bits/stdc++.h>
  2. #define N 305
  3. #define M 90005
  4. using namespace std;
  5. inline int read(){
  6. int ans=0;
  7. char ch=getchar();
  8. while(!isdigit(ch))ch=getchar();
  9. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  10. return ans;
  11. }
  12. int n,m;
  13. struct edge{int v,next,c,w;};
  14. struct MCMF{
  15. int first[N],d[N],pos[N],pred[N],flow[N],cnt,s,t;
  16. bool in[N];
  17. edge e[M];
  18. inline void init(){memset(first,-1,sizeof(first)),cnt=-1,s=0,t=n+m+1;}
  19. inline void addedge(int u,int v,int c,int w){e[++cnt].v=v,e[cnt].w=w,e[cnt].c=c,e[cnt].next=first[u],first[u]=cnt;}
  20. inline void add(int u,int v,int c,int w){addedge(u,v,c,w),addedge(v,u,0,-w);}
  21. inline bool spfa1(){
  22. queue<int>q;
  23. for(int i=1;i<=t;++i)d[i]=0x3f3f3f3f;
  24. d[s]=0,flow[s]=0x3f3f3f3f,pred[t]=-1,in[s]=1,q.push(s);
  25. while(!q.empty()){
  26. int x=q.front();
  27. q.pop(),in[x]=0;
  28. for(int i=first[x];~i;i=e[i].next){
  29. int v=e[i].v;
  30. if(e[i].c&&d[v]>d[x]+e[i].w){
  31. d[v]=d[x]+e[i].w,flow[v]=min(flow[x],e[i].c),pred[v]=x,pos[v]=i;
  32. if(!in[v])in[v]=1,q.push(v);
  33. }
  34. }
  35. }
  36. return d[t]!=0x3f3f3f3f;
  37. }
  38. inline bool spfa2(){
  39. queue<int>q;
  40. for(int i=1;i<=t;++i)d[i]=-0x3f3f3f3f;
  41. d[s]=0,flow[s]=0x3f3f3f3f,pred[t]=-1,in[s]=1,q.push(s);
  42. while(!q.empty()){
  43. int x=q.front();
  44. q.pop(),in[x]=0;
  45. for(int i=first[x];~i;i=e[i].next){
  46. int v=e[i].v;
  47. if(e[i].c&&d[v]<d[x]+e[i].w){
  48. d[v]=d[x]+e[i].w,flow[v]=min(flow[x],e[i].c),pred[v]=x,pos[v]=i;
  49. if(!in[v])in[v]=1,q.push(v);
  50. }
  51. }
  52. }
  53. return d[t]!=-0x3f3f3f3f;
  54. }
  55. inline int solve1(){
  56. int ret=0;
  57. for(int w=t;spfa1();w=t){
  58. ret+=d[t]*flow[t];
  59. while(w!=s)e[pos[w]].c-=flow[t],e[pos[w]^1].c+=flow[t],w=pred[w];
  60. }
  61. return ret;
  62. }
  63. inline int solve2(){
  64. int ret=0;
  65. for(int w=t;spfa2();w=t){
  66. ret+=d[t]*flow[t];
  67. while(w!=s)e[pos[w]].c-=flow[t],e[pos[w]^1].c+=flow[t],w=pred[w];
  68. }
  69. return ret;
  70. }
  71. }mcmf1,mcmf2;
  72. int main(){
  73. m=read(),n=read(),mcmf1.init(),mcmf2.init();
  74. for(int i=1,val;i<=m;++i)val=read(),mcmf1.add(mcmf1.s,i,val,0),mcmf2.add(mcmf2.s,i,val,0);
  75. for(int i=1,val;i<=n;++i)val=read(),mcmf1.add(i+m,mcmf1.t,val,0),mcmf2.add(i+m,mcmf2.t,val,0);
  76. for(int i=1,val;i<=m;++i)for(int j=1;j<=n;++j)val=read(),mcmf1.add(i,j+m,0x3f3f3f3f,val),mcmf2.add(i,j+m,0x3f3f3f3f,val);
  77. printf("%d\n%d",mcmf1.solve1(),mcmf2.solve2());
  78. return 0;
  79. }

2018.10.14 loj#6011. 「网络流 24 题」运输问题(费用流)的更多相关文章

  1. 2018.10.14 loj#6003. 「网络流 24 题」魔术球(最大流)

    传送门 网络流好题. 这道题可以动态建图. 不难想到把每个球iii都拆点成i1i_1i1​和i2i_2i2​,每次连边(s,i1),(i2,t)(s,i_1),(i_2,t)(s,i1​),(i2​, ...

  2. 2018.10.14 loj#6012. 「网络流 24 题」分配问题(费用流)

    传送门 费用流水题. 依然是照着题意模拟建边就行了. 为了练板子又重新写了一遍费用流. 代码: #include<bits/stdc++.h> #define N 305 #define ...

  3. 【刷题】LOJ 6011 「网络流 24 题」运输问题

    题目描述 W 公司有 \(m\) 个仓库和 \(n\) 个零售商店.第 \(i\) 个仓库有 \(a_i\) 个单位的货物:第 \(j\) 个零售商店需要 \(b_j\) 个单位的货物.货物供需平衡, ...

  4. 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)

    传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...

  5. 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)

    传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...

  6. Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)

    Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...

  7. LIbreOJ #6011. 「网络流 24 题」运输问题 最小费用最大流

    #6011. 「网络流 24 题」运输问题 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  8. 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题

    题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...

  9. [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划

    [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...

随机推荐

  1. JSP生成WORD文档,EXCEL文档及PDF文档的方法

    转自:https://www.jb51.net/article/73528.htm 本文实例讲述了JSP生成WORD文档,EXCEL文档及PDF文档的方法.分享给大家供大家参考,具体如下: 在web- ...

  2. Celery ---- 分布式队列神器 ---- 入门

    原文:http://python.jobbole.com/87238/ 参考:https://zhuanlan.zhihu.com/p/22304455 Celery 是什么? Celery 是一个由 ...

  3. maven错误

    maven-enforcer-plugin (goal "enforce") is ignored by m2e. Plugin execution not covered by ...

  4. UI5-文档-4.10-Descriptor for Applications

    所有特定于应用程序的配置设置现在将进一步放在一个名为manifest的单独描述符文件中.json.这清楚地将应用程序编码从配置设置中分离出来,使我们的应用程序更加灵活.例如,所有SAP Fiori应用 ...

  5. event bManualResult

    MSDN: bManualReset [in] If this parameter is TRUE, the function creates a manual-reset event object, ...

  6. 千万级高并发负载均衡软件haproxy配置文件详解

    balance roundrobin         #轮询方式 balance source               #将用户IP经过hash计算后,使同一IP地址的所有请求都发送到同一固定的后 ...

  7. SQL语言类别

    SQL语言主要分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL. DQL (data query language) DML(data manipulati ...

  8. 吴裕雄 数据挖掘与分析案例实战(3)——python数值计算工具:Numpy

    # 导入模块,并重命名为npimport numpy as np# 单个列表创建一维数组arr1 = np.array([3,10,8,7,34,11,28,72])print('一维数组:\n',a ...

  9. python的map函数和reduce函数(转)

    map函数 map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例 ...

  10. 56. Merge Intervals (Array; Sort)

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...