网络流24题之负载平衡问题

题目描述:

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

模型分析:

1.首先弄清楚题目要求什么,最终流量应该是确定的,所以应该是在最大流的前提下使得费用最小,也就是最小费用流问题。

2.题目有2个限制条件,一个是最终每个仓库的库存量都必须是ave(原库存的平均数),一个是只能相邻仓库之间才能运货。

3.对于第一个条件,可以想象有1个超级大的仓库T,最终所有仓库的货物都要运到它那里,那么只要让所有仓库到T的弧的容量为ave,在最大流的前提下,最终这些弧一定是满载的,也就是说最终所有的仓库的货物都是ave。 另外每个仓库一开始也有一些货物,同样的道理只要增加一个大仓库S,让S到其他仓库的弧的容量为这些仓库的初始货物量,,在最大流的前提下,最终这些弧一定是满载的,也就是说所有仓库一开始的货物确定了。当然这些弧都是不要费用的。

4.对于第二个条件,自然想到可以让相邻的仓库之间连容量为inf,费用为1的边,那么求最小费用流就是答案了。

构图方法:

1.增加源点S和汇点T。

2.从S到所有仓库连一条容量为仓库初始货物数量,费用为0的边。

3.从所有仓库到T连一条容量为ave,费用为0的边。

4.相邻的仓库之间连容量为inf,费用为1的边。

总结:

熟悉了最小费用最大流的连续最短路做法,第一次写还真是错误百出,调试了好久。



其实这道题我一开始的做法是数学做法,600B的代码秒杀网络流。

设仓库的编号分别为u1,u2,u3..un ,仓库ui给了仓库ui+1 xi 件货物(可以为负数,即ui+1给ui货物), xn表示un给u1 。

各个仓库的初始货物数量分别为a1,a2,a3...an

那么有

a1+xn-x1=ave

a2+x1-x2=ave

a3+x2-x3=ave

......

an+xn-1-xn=ave

可以发现当xn确定的时候,所有的xi便确定了。

变换一下式子,那么有

x1=xn-(ave-a1)

x2=xn-[(ave-a1)+(ave-a2)]

x3=xn-[(ave-a1)+(ave-a2)+(ave-a3)]

......

xn=xn-0

现在的目标是最小化|x1|+|x2|+|x3|......+|xn|

也就是最小化数轴上点xn到(ave-a1),[(ave-a1)+(ave-a2)],[(ave-a1)+(ave-a2)+(ave-a3)]...0 这些点的距离之和。

问题转化为给定数轴上n点,求数轴上一点P使得这n个点到P的距离之和最小,这就涉及中位数的一些知识了,只要按坐标排序,取第(n+1)/2个点所在的位置就可以了。具体的证明也很简单,可以查阅相关资料。

按照这个方法写的程序,在OJ上测评AC了。

问题是否就解决了呢?

以前做某一年NOIP一道叫均分纸牌的题目,方法也有些类似,当时我就一直在想,对于合法的序列x1,x2...xn,是否一定存在方案使得移动的总步数为它们的绝对值之和呢? 比如一个仓库本来只有5件货物,但是它要给右边的仓库10件货物,那么必须要它左边的仓库给它5件货,那么要是它左边的仓库货也不够呢?一直推下去,会不会存在一个状态,使得没有一个仓库可以满足它的xi呢?

这个问题困扰了我很久,前几天火来直接拿了一节晚自习”冥想“,结果还真想出来了。

首先对于xi,如果它为正,那么连一条弧<i,i+1>,容量为xi。如果是负,那么连一条弧<i,i-1>,容量为-xi

对于上面提到的情况,我们没有必要一次性满足xi,也就是现在有多少货,如果要分给旁边的,就先分给它。

对于当前货物数量大于ave的仓库,必然有没有满载的弧连向边上的点,否则最后它的货物怎么会ave呢。那么每次至少可以让一条弧的流量+1,直到最后所有弧都满载,那么就不可能出现卡死的局面了。 可能有人会说如果当前没有货物数量大于ave的仓库,那就无法移动了。其实由于总的货物数量是ave*n,那么只能是所有仓库的货物都是ave,那么这个时候已经完成任务了。

时间: 2024-10-13 16:19:08

网络流24题之负载平衡问题的相关文章

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

#6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入格式 文件的第 1 11 行中有 1 11 个正整数 n nn,表示有 n nn 个仓库.第 2 22 行中有 n nn 个

「网络流 24 题」负载平衡

过水不解释 #include<bits/stdc++.h> using namespace std; long long tot=-1,sum=0,h[1005],flow[1005],g[1005],ans=0,dis[1005],ans2=0,inf=999999; bool vis[1005]; struct node{ long long from,to,next,rest,cost; }e[10000005]; void add(long long x,long long y,lon

「网络流24题」 题目列表

「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分图最小路径覆盖 <3> 4 魔术球问题 <4> 5 圆桌问题 <5> 6 最长递增子序列问题 <6> 7 试题库问题 <7> 8 机器人路径规划问题 <8> 9 方格取数问题 二分图最大点权独立集 <9> 10 餐巾计划问题

网络流24题小结

网络流24题 前言 网络流的实战应用篇太难做了,因此先完善这一部分 ## 第一题:飞行员配对方案 \(BSOJ2542\)--二分图 最优匹配 题意 两国飞行员\(x\)集合\(y\)集合,\(x\)飞行员可以配对特定的\(y\)集合的飞行员(可无),求一对一配对最大数 Solution 二分图最大匹配裸题,最大流实现 建图:(设\(i\in x\)而\(i'\in y\)) \((S,i,1)~(i',T,1)\) 对\((i,j')\)可匹配\((i,j',1)\) Code 略 ## 第二

【网络流24题----14】孤岛营救问题

孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形,其南北方向被划分为 N行,东西方向被划分为 M列,于是整个迷宫被划分为 N×M个单元.每个单元的位置可用一个有序数对 (单元的行号,单元的列号)来表示.南北或东西方向相邻的 2个单元之间可能互

【网络流24题】

网络流 网络流24题 [最小路径覆盖问题] 关于输出路径,因为即使有反向弧经过左侧点也一定会改变左侧点的去向,若没连向右侧就会被更新到0,所以不用在意. mark记录有入度的右侧点,然后从没入度的右侧点开始把整条路径输出来即可. #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=100000,inf=0x3f3f3f3f; int n,m,

【网络流24题】魔术球问题

P1226 - [网络流24题]魔术球问题 Description 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可 放11个球. ′编程任务: 对于给定的n,计算在 n根柱子上最多能放多少个球. Input 第1 行有 1个正整数n,表示柱子数. Output 第一行是球

AC日记——[网络流24题]骑士共存 cogs 746

746. [网络流24题] 骑士共存 ★★☆   输入文件:knight.in   输出文件:knight.out   简单对比时间限制:1 s   内存限制:128 MB 骑士共存问题 «问题描述: 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务: 对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑 士,使得它们彼此互不攻击. «数据输入: 由文件knight.in给出输入数据.第一行

网络流24题

刷刷基础题来巩固一下基础.. #1.飞行员配对方案问题 pdf链接 听说各大OJ的题面都和pdf不同.. 嗯连边匹配就行.. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <queue> using namespace std; const int Maxn = 110; struct node { int y, next