Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)

Description

G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最少搬运量可以使n 个仓库的库存数量相同。搬运货物时,只能在相邻的仓库之间搬运。

«编程任务:

对于给定的n 个环形排列的仓库的库存量,编程计算使n 个仓库的库存数量相同的最少搬运量。

Input

第1 行中有1 个正整数n(n<=100),表示有n个仓库。

第2 行中有n个正整数,表示n个仓库的库存量。

Output

将计算出的最少搬运量输出

Sample Input

5

17 9 14 16 4

Sample Output

11

Http

Libre:https://loj.ac/problem/6013

Source

网络流,最小费用最大流

解决思路

对于每一个仓库,我们从源点连出一条容量为仓库存储的货物数量费用为0的边,连到汇点连一条容量库存数目总和/n花费为0的边。在对于每一个相邻的仓库连容量为无穷大费用为1的边。这样跑一边最小费用最大流就可以得到最终的答案

代码

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxN=250;
  8. const int maxM=maxN*maxN*4;
  9. const int inf=2147483647;
  10. class Edge
  11. {
  12. public:
  13. int u,v,cost,flow;
  14. };
  15. int n;
  16. int cnt=-1;
  17. int Head[maxN];
  18. int Next[maxM];
  19. Edge E[maxM];
  20. int Dist[maxN];
  21. int Flow[maxN];
  22. int Path[maxN];
  23. bool inqueue[maxN];
  24. int Q[maxM];
  25. void Add_Edge(int u,int v,int cost,int flow);
  26. bool spfa();
  27. int main()
  28. {
  29. memset(Head,-1,sizeof(Head));
  30. int sum=0;
  31. scanf("%d",&n);
  32. for (int i=1;i<=n;i++)
  33. {
  34. int num;
  35. scanf("%d",&num);
  36. sum+=num;//求和,因为要统计所有仓库库存之和
  37. Add_Edge(0,i,0,num);//连接源点与仓库i
  38. if (i==1)//连接i与其前一个仓库,注意判断1的情况
  39. Add_Edge(1,n,1,inf);
  40. else
  41. Add_Edge(i,i-1,1,inf);
  42. if (i==n)//连接i与后一个仓库,注意判断n的情况
  43. Add_Edge(n,1,1,inf);
  44. else
  45. Add_Edge(i,i+1,1,inf);
  46. }
  47. sum=sum/n;
  48. for (int i=1;i<=n;i++)//连接i与汇点
  49. Add_Edge(i,n+1,0,sum);
  50. int Ans=0;//最小费用最大流
  51. while (spfa())
  52. {
  53. int now=n+1;
  54. int last=Path[now];
  55. while (now!=0)
  56. {
  57. E[last].flow-=Flow[n+1];
  58. E[last^1].flow+=Flow[n+1];
  59. now=E[last].u;
  60. last=Path[now];
  61. }
  62. Ans+=Dist[n+1]*Flow[n+1];
  63. }
  64. cout<<Ans<<endl;
  65. return 0;
  66. }
  67. void Add_Edge(int u,int v,int cost,int flow)
  68. {
  69. cnt++;
  70. Next[cnt]=Head[u];
  71. Head[u]=cnt;
  72. E[cnt].u=u;
  73. E[cnt].v=v;
  74. E[cnt].flow=flow;
  75. E[cnt].cost=cost;
  76. cnt++;
  77. Next[cnt]=Head[v];
  78. Head[v]=cnt;
  79. E[cnt].u=v;
  80. E[cnt].v=u;
  81. E[cnt].flow=0;
  82. E[cnt].cost=-cost;
  83. }
  84. bool spfa()
  85. {
  86. for (int i=0;i<=n+1;i++)
  87. Dist[i]=inf;
  88. memset(inqueue,0,sizeof(inqueue));
  89. Dist[0]=0;
  90. inqueue[0]=1;
  91. int h=1,t=0;
  92. Q[1]=0;
  93. Flow[0]=inf;
  94. do
  95. {
  96. t++;
  97. int u=Q[t];
  98. inqueue[u]=0;
  99. for (int i=Head[u];i!=-1;i=Next[i])
  100. {
  101. int v=E[i].v;
  102. if ((E[i].flow>0)&&(Dist[u]+E[i].cost<Dist[v]))
  103. {
  104. Dist[v]=Dist[u]+E[i].cost;
  105. Flow[v]=min(Flow[u],E[i].flow);
  106. Path[v]=i;
  107. if (inqueue[v]==0)
  108. {
  109. h++;
  110. Q[h]=v;
  111. inqueue[v]=1;
  112. }
  113. }
  114. }
  115. }
  116. while(h!=t);
  117. if (Dist[n+1]==inf)
  118. return 0;
  119. return 1;
  120. }

Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)的更多相关文章

  1. LibreOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题

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

  2. loj #6013. 「网络流 24 题」负载平衡

    #6013. 「网络流 24 题」负载平衡 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时 ...

  3. Luogu P4016 「 网络流 24 题 」负载平衡问题

    吐槽题目难度,这个题建模好像比前两个都要难,但是难度评级却比第二个要低. 解题思路 依旧是考虑如何建模和建立源点汇点.每个点的货物数量到最后都一样的话肯定是等于他们的平均值.用 $num$ 数组存储原 ...

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

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

  5. 【刷题】LOJ 6013 「网络流 24 题」负载平衡

    题目描述 G 公司有 \(n\) 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 \(n\) 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入格式 ...

  6. 【PowerOJ1754&网络流24题】负载平衡问题(费用流)

    题意: 思路: [问题分析] 转化为供求平衡问题,用最小费用最大流解决. [建模方法] 首先求出所有仓库存货量平均值,设第i个仓库的盈余量为A[i],A[i] = 第i个仓库原有存货量 - 平均存货量 ...

  7. Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)

    Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...

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

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

  9. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

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

随机推荐

  1. Slurm任务调度系统部署和测试(源码)(1)

    1. 概述1.1 节点信息2. 节点准备3. 部署NTP服务器4. 部署LDAP服务器5. 部署Munge认证服务6. 部署Mysql数据库服务7. 部署slurm7.1 创建slurm用户7.2 挂 ...

  2. PHP从入门到精通(五)

    字符串三种声明方式 1."":双引号中可以解析变量"{$a}",双引号中可以使用任何转义字符:2.'':单引号中不可以解析变量,单引号中不可以使用转义字符(但是 ...

  3. 常见IP端口

    21端口:21端口主要用于FTP(File Transfer Protocol,文件传输协议)服务. 23端口:23端口主要用于Telnet(远程登录)服务,是Internet上普遍采用的登录和仿真程 ...

  4. 团队项目 NABCD分析java音乐播放器

    NABCD分析java音乐播放器 程设计题目:java音乐播放器 一.课程设计目的 1.编程设计音乐播放软件,使之实现音乐播放的功能. 2.培养学生用程序解决实际问题的能力和兴趣. 3.加深java中 ...

  5. Filter(转载)

    web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...

  6. elastic-search-kibana-in-docker-dotnet-core-app

    [翻译] 使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据   原文地址:http://www.dotnetcurry.com/aspnet/1354/e ...

  7. 2017BUAA软工个人作业Week1

    大概的功能已经满足 暂时只能用debug中的exe文件 正在改进... https://github.com/qwellk/project1/tree/product1 PSP2.1 Personal ...

  8. HDU 2012 素数判定

    http://acm.hdu.edu.cn/showproblem.php?pid=2012 Problem Description 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括 ...

  9. XMLHttpRequest.withCredentials

    https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials var xhr = new XMLHtt ...

  10. [转帖] BIO与NIO、AIO的区别

    培训里面讲的东西  自己查了下 啥意思,,, 转帖强化一下. http://blog.csdn.net/skiof007/article/details/52873421 IO的方式通常分为几种,同步 ...