题目链接:点击查看

题目大意:有n个仓库分布在一个环形的区域,现在每个仓库可以与相邻的两个仓库转移货物,问最少需要操作多少次才能让每个仓库的货物都达到平衡

题目分析:达到平衡的意思其实就是都等于平均值,这个题目就是均分纸牌问题的环形版本,而且n给的特别小,可以直接n*n暴力来做,如果n给的比较大,就要用到之前学过的中位数优化来解决了,不过在这个题目没有必要,毕竟是要练习网络流的,所以可以选择费用流来解决

其实对于每个仓库无非只有两种状态:

  1. 大于平均值:需要将当前仓库的货物运出去
  2. 小于平均值:当前仓库需要进货

这样一来我们的问题就转换为了如何选择方案将大于平均值的仓库中的货物运给小于平均值的仓库中去,图就比较好建了:

  1. 源点->大于平均值的仓库,流量为多出来的货物,花费为0
  2. 每个仓库->相邻两个仓库,流量为无穷大,花费为1
  3. 小于平均值的仓库->汇点,流量为缺少的货物,花费为0

然后跑最小费用最大流就是答案了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;//点const int M=N*N;//边struct Edge
{int to,w,cost,next;
}edge[M];int head[N],cnt,a[N];void addedge(int u,int v,int w,int cost)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].cost=cost;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;edge[cnt].cost=-cost;edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],incf[N],pre[N];bool vis[N];bool spfa(int s,int t)
{memset(d,inf,sizeof(d));memset(vis,false,sizeof(vis));memset(pre,-1,sizeof(pre));queue<int>q;q.push(s);vis[s]=true;incf[s]=inf;d[s]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=false;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;int cost=edge[i].cost;if(!w)continue;if(d[v]>d[u]+cost){d[v]=d[u]+cost;pre[v]=i;incf[v]=min(incf[u],w);if(!vis[v]){vis[v]=true;q.push(v);}}}}return pre[t]!=-1;
}int update(int s,int t)
{int x=t;while(x!=s){int i=pre[x];edge[i].w-=incf[t];edge[i^1].w+=incf[t];x=edge[i^1].to;}return d[t]*incf[t];
}void init()
{memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0;while(spfa(st,ed))ans+=update(st,ed);return ans;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);init();int n,st=N-1,ed=st-1;scanf("%d",&n);int sum=0;for(int i=0;i<n;i++){scanf("%d",a+i);sum+=a[i];}sum/=n;for(int i=0;i<n;i++)a[i]-=sum;for(int i=0;i<n;i++){if(a[i]>0)addedge(st,i,a[i],0);elseaddedge(i,ed,-a[i],0);int pre=(i-1+n)%n;int next=(i+1)%n;addedge(i,pre,inf,1);addedge(i,next,inf,1);}printf("%d\n",solve(st,ed));return 0;
}

洛谷 - P4016 负载平衡问题(最小费用最大流)相关推荐

  1. P4016 负载平衡问题(最小费用最大流)

    P4016 负载平衡问题 题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬 ...

  2. 洛谷P4016 负载平衡问题

    洛谷P4016 负载平衡问题 题目大意: G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只 能在相邻的仓库之间 ...

  3. 洛谷 P4016 负载平衡问题 【最小费用最大流】

    求出平均数sum,对于大于sum的点连接(s,i,a[i]-sum,0),表示这个点可以流出多余的部分,对于小于sum的点连接(i,t,sum-a[i],0)表示这个点可以接受少的部分,然后每个点向相 ...

  4. 洛谷 - P1251 餐巾计划问题(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n天每天所需要的新餐巾的数量,现在有多种方式可以获得新餐巾,问如何运营能使花费最少: 直接购买,花费为cost 将脏餐巾送到快洗部,需要洗t1天,花费为c1 将脏餐巾 ...

  5. 洛谷 P2053 [SCOI2007]修车 网络流 最小费用最大流 Dinic+Spfa

    题目链接: https://www.luogu.com.cn/problem/P2053 思路参考博客: https://www.luogu.com.cn/blog/a23333/solution-p ...

  6. 洛谷 P3381 【模板】最小费用最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数\(N.M.S.T\) ...

  7. 洛谷 3381 【模板】最小费用最大流

    https://www.luogu.org/problem/show?pid=3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流 ...

  8. 洛谷 - P3980 [NOI2008]志愿者招募(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:现在有n天需要志愿者,每一天需要招募的人数是Ai个人,现在有m类志愿者,每类志愿者可以在[l,r]天内被招募,需要花费的代价为Ci,现在需要安排一种招募方式,可以使得总花 ...

  9. 洛谷P3381 【模板】最小费用最大流

    传送门 费用流板子 细节真多--一个边的flow和点的flow分不清--还有往回减流的时候应该减去flow[t]-- 1 //minamoto 2 #include<iostream> 3 ...

最新文章

  1. Windows(64位IIS)未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
  2. 如何直接在github上预览html网页效果
  3. wxHtml 示例:wxHtmlEasyPrinting 测试
  4. 『收集』体验微软ImageX 玩转系统映像文件
  5. 大数据发行版本+组件中的竞品/等同地位关系(持续更新中)
  6. winre drv分区干嘛用的_都2020年了,还在给硬盘分区?看完你就知道有没有必要了...
  7. 改變HTML中的光標問題
  8. C++ opengl 启动光照
  9. Hexo + coding 博客的搭建和优化
  10. mxnet入门--第4篇
  11. 用C/C++编程技术教你制作彩票随机程序
  12. 棋牌游戏-c#实现批量修改文件后缀
  13. Java基于springboot办公OA管理系统源码
  14. EFM32 LG232系列单片机干货之LEUART
  15. Cadence Capture CIS / OrCAD Capture 原理图中显示封装“Show Footprint”的问题
  16. 好嗨哟!OneOS 图形组件显示自己喜欢的图片
  17. Linux系列:linux中查看文件时显示行号
  18. GitLab之something went wrong during merge pre-receive hook问题
  19. 看完这篇文章保你面试稳操胜券 ——(必考题)javaScript 篇
  20. 基于机器学习的恶意软件检测(一)

热门文章

  1. 基于session认证
  2. MySQL 高级 - 语法 - if判断
  3. SpringSecurity分布式整合之认证服务配置文件编写和测试
  4. Nacos-环境隔离
  5. RabbitMQ发布确认原理
  6. 初步认识Volatile-JMM
  7. 初步认识Volatile-总线锁和缓存锁
  8. 定位Bean 扫描路径
  9. 使用SpringTask定时获取传感器设备信息并缓存到Redis
  10. MyBatis常用配置解析-environments标签