洛谷P4016 负载平衡问题

题目大意:

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

能在相邻的仓库之间搬运。

思路:

  最小费用最大流。

  假设物品的总库存之和为sum,那么为了使库存之和相等,搬运结束后每一个仓库的目标库存量ave应该都等于sum/n。

  这时候很显然,我们发现初始库存量>ave的仓库会向其他仓库搬运货物,而初始库存量<ave的仓库会接收货物。

  所以我们将所有仓库的初始货物数nums[i]减去ave,如果nums[i]-ave>0,那么由超级源点向他发出一条流量为nums[i]-ave,费用为0的边。

  如果nums[i]-ave<0,那么由他向超级汇点发出一条流量为ave-nums[i],费用为0的边。

  最后再在所有相邻的仓库之间互相建立流量为无穷大,费用为1的双向边。

  然后就没有然后了。。。

我的错误o(╥﹏╥)o

  1、一开始直接跑了最大流,结果WA了9个点,后来发现最大流无法计算转移量之和,其实这是一个很蠢的错误、、、

  2、加双向边的时候有一个细节,因为我用的是邻接表,一开始加双向边的时候没有加入费用为负的辅助边,结果还是WA了9个点。。。

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 using namespace std;
 7 #define MAXN 110
 8 struct Node{
 9     int u,v,w,c;
10     Node(){}
11     Node(int u,int v,int w,int c):u(u),v(v),w(w),c(c){}
12 }p[MAXN<<3];
13 struct Record{
14     int u,dis;
15     Record(){}
16     Record(int u,int dis):u(u),dis(dis){}
17     bool operator < (const Record & a) const{
18         return dis>a.dis;
19     }
20 };
21 int head[MAXN],Next[MAXN<<3],nums[MAXN],dis[MAXN],pre[MAXN],preNode[MAXN];
22 bool vis[MAXN];
23 int i,j,k,m,n,tot,sum;
24 void addNode(int u,int v,int w,int c){
25     p[++tot]=Node(u,v,w,c);
26     Next[tot]=head[u],head[u]=tot;
27     p[++tot]=Node(v,u,0,-c);
28     Next[tot]=head[v],head[v]=tot;
29 }
30 bool dijkstra(int src,int goal){
31     priority_queue<Record> mque;
32     while(!mque.empty()) mque.pop();
33     for(register int i=0;i<=n+1;i++) vis[i]=false,dis[i]=1000000000;
34     mque.push(Record(src,0));
35     vis[src]=true; dis[src]=0;
36     pre[src]=-1;
37     while(!mque.empty()){
38         Record tmp=mque.top(); mque.pop();
39         if(dis[tmp.u]<tmp.dis) continue;
40         //if(vis[tmp.u]) continue;
41         for(register int i=head[tmp.u];i+1;i=Next[i]){
42             if(p[i].w&&dis[tmp.u]+p[i].c<dis[p[i].v]){
43                 pre[p[i].v]=tmp.u;
44                 preNode[p[i].v]=i;
45                 dis[p[i].v]=dis[tmp.u]+p[i].c;
46                 mque.push(Record(p[i].v,dis[p[i].v]));
47             }
48         }
49     }
50     if(dis[goal]!=1000000000) return true;
51     return false;
52 }
53 int dinic(int src,int goal){
54     int ans=0;
55     while(dijkstra(src,goal)){
56         int minf=1000000000;
57         for(register int i=goal;i!=src;i=pre[i]){
58             minf=min(minf,p[preNode[i]].w);
59         }
60         for(register int i=goal;i!=src;i=pre[i]){
61             p[preNode[i]].w-=minf;
62             p[preNode[i]^1].w+=minf;
63         }
64         ans+=dis[goal]*minf;
65     }
66     return ans;
67 }
68 int main(){
69     scanf("%d",&n);
70     sum=0;
71     for(i=1;i<=n;i++) scanf("%d",nums+i),sum+=nums[i];
72     sum/=n;
73     for(i=0;i<=n+1;i++) head[i]=-1;
74     tot=-1;
75     for(i=1;i<=n;i++) nums[i]-=sum;
76     for(i=1;i<=n;i++) if(nums[i]>0) addNode(0,i,nums[i],0); else { if(nums[i]<0) addNode(i,n+1,-nums[i],0); }
77     for(i=1;i<=n-1;i++) addNode(i,i+1,10000000,1),addNode(i+1,i,10000000,1);
78     addNode(n,1,10000000,1),addNode(1,n,10000000,1);
79     printf("%d\n",dinic(0,n+1));
80     return 0;
81 }

转载于:https://www.cnblogs.com/linxif2008/p/9532392.html

洛谷P4016 负载平衡问题相关推荐

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

    题目链接:点击查看 题目大意:有n个仓库分布在一个环形的区域,现在每个仓库可以与相邻的两个仓库转移货物,问最少需要操作多少次才能让每个仓库的货物都达到平衡 题目分析:达到平衡的意思其实就是都等于平均值 ...

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

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

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

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

  4. P4016 负载平衡问题

    文章目录 题目描述 题解: 方法一: 代码: 方法二: P4016 负载平衡问题 题目描述 G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n 个仓库 ...

  5. LUOGU P4016 负载平衡问题

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

  6. 洛谷——网络流24题

    P2756 飞行员配对方案问题 P2762 太空飞行计划问题 P4014 分配问题 P2774 方格取数问题 P4009 汽车加油行驶问题 P4015 运输问题 P3254 圆桌问题 P2763 试题 ...

  7. 模拟退火总结+洛谷模板题(P1337 [JSOI2004]平衡点 / 吊打XXX)

    原来就听说过模拟退火,然后一直觉得神奇,但是没有真正的去实现这个算法. 模拟退火对TSP之类的问题很实用. 1.概念:模拟退火算法(Simulate Anneal,SA)是一种通用概率演算法,用来在一 ...

  8. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  9. BZOJ1112: [POI2008]砖块Klo(洛谷P3466)

    平衡树 BZOJ题目传送门 洛谷题目传送门 动态维护中位数,平衡树上一发就好了. 代码: #include<cctype> #include<cstdio> #include& ...

最新文章

  1. 网友:Java岗,自学一个月跳槽计算机视觉!附学习资源合集
  2. linux上使用crontab任务调度
  3. django的sqlite3的使用_2_第一个模型
  4. SLAM学习--2D激光SLAM-圣经-概率机器人学各种扩展
  5. 网页中加载obj模型比较慢_Web前端优化技巧分享,让你的网页显示的更流畅
  6. python wav模块获取采样率, 采样点,声道,量化位数和时间
  7. nagios的搭建及配置----(中)
  8. mysql获取相隔时间段的数据
  9. JavaScript Iframe富文本编辑器中的光标定位
  10. wp8数据存储--独立存储文件 【转】
  11. QT给文本添加链接事件
  12. Flask开发天气查询软件,带你掌握pipenv的使用与手机Termux下的部署
  13. java怎样自动调用鼠标点击屏幕固定地方_python办公自动化:让PyAutoGUI来帮你干活...
  14. 鲁大师检测内存条_外观漂亮,做工精致,潜力巨大、十铨(Team)8GB×2 3200Mhz台式机内存条 火神系列 评测...
  15. 好评率超高的几个硬核公众号,99%的程序员都关注了!
  16. 区块链项目开发区块链应用场景需满足3个
  17. C#——NotifyICON的使用
  18. linux pipe2函数,pipe()函数 Unix/Linux
  19. Vue -脚手架的安装
  20. FFmpeg指令(./configure 其他)

热门文章

  1. H5调用APP的方法
  2. 概率论与数理统计(一)
  3. C++理解全局变量在调用函数中的应用
  4. collections python_python: collections
  5. 初识Django —Python API接口编程入门
  6. PHP(TP5)获取微信小程序unionId
  7. thymeleaf常用属性
  8. python 读帧和绘图的区别
  9. Eclipse 创建web项目后没有 Java EE 5 Library,没有web开发相关基础java包,myeclipse中有。...
  10. 文字或者图片连续滚动