2194. 负载平衡问题(网络流,费用流)

活动 - AcWing

G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。

如何用最少搬运量可以使 n 个仓库的库存数量相同。

搬运货物时,只能在相邻的仓库之间搬运。

数据保证一定有解。

输入格式

第 1 行中有 1 个正整数 n,表示有 n 个仓库。

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

输出格式

输出最少搬运量。

数据范围

1≤n≤100
每个仓库的库存量不超过 100

输入样例:
5
17 9 14 16 4
输出样例:
11

解析: 

我们可以计算出最终每个仓库的货物数量 x,设第 i 个仓库的货物数量是 ai,那么所有货物一定会分成两类,一类是 ai>x,即一定会从这些仓库中流出货物,另一类是 ai<x,即一定会有货物流入这些仓库。

因此我们可以根据这两类,将所有 ai>x 的仓库作为左部节点,所有 ai<x 的仓库作为右部节点。从源点向所有左部节点连边,容量就是左部节点最开始多出来的货物,即 ai−x,费用就是 0,因为最开始货物就在左部节点中。从所有右部节点向汇点连边,容量就是右部节点缺少的货物,即 x−ai,费用也是 0,因为最终货物到右部节点就停止了。然后从每个仓库向相邻两个仓库连边,容量是 +∞,费用是 1,表示一次搬运量。

然后还需要证明对应关系,对于任意一个原问题的情况,从源点流进仓库的流量等于流出的流量(根据上述新图的定义),满足流量守恒;又因为根据上述新图的定义,易知边一定满足容量限制,所以原问题的方案对应一个最大流。同时,更具上述的建的新图,易知流量产生的费用对应一个问题的方案。因此,原问题和新图的最大流是一一对应的,且数值上相等。

并且可以发现原问题的搬运量就对应的流网络的可行流的费用,因此最小搬运量就对应了最小费用最大流,用 EK 算法来求即可

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 100 + 10, M = (100*2+100) * 2 + 10, INF = 0x3f3f3f3f;
int n, m, S, T;
int h[N], e[M], f[M],w[M], ne[M],idx;
int q[N], d[N], pre[N], incf[N];
bool st[N];
int p[N];void add(int a, int b, int c,int d) {e[idx] = b, f[idx] = c, w[idx] = d, ne[idx] = h[a], h[a] = idx++;e[idx] = a, f[idx] = 0, w[idx] = -d, ne[idx] = h[b], h[b] = idx++;
}bool spfa() {int hh = 0, tt = 1;memset(d, 0x3f, sizeof d);memset(incf, 0, sizeof incf);q[0] = S, d[S] = 0, incf[S] = 0x3f;while (hh != tt) {int t = q[hh++];if (hh == N)hh = 0;st[t] = 0;for (int i = h[t]; i != -1; i = ne[i]) {int j = e[i];if (f[i] && d[j] > d[t] + w[i]) {d[j] = d[t] + w[i];pre[j] = i;incf[j] = min(incf[t], f[i]);if (!st[j]) {q[tt++] = j;if (tt == N)tt = 0;st[j] = 1;}}}}return incf[T] > 0;
}int EK() {int cost = 0;while (spfa()) {int t = incf[T];cost += t * d[T];for (int i = T; i != S; i = e[pre[i] ^ 1]) {f[pre[i]] -= t;f[pre[i] ^ 1] += t;}}return cost;
}int main() {cin >> n;memset(h, -1, sizeof h);S = 0, T = n + 1;int tot = 0;for (int i = 1,a; i <= n; i++) {scanf("%d", &p[i]);tot += p[i];add(i, i < n ? i + 1 : 1, INF, 1);add(i, i > 1 ? i - 1 : n, INF, 1);}tot /= n;for (int i = 1; i <= n; i++) {if (p[i] > tot)add(S, i, p[i] - tot, 0);else if(tot>p[i])add(i, T, tot - p[i], 0);}printf("%d\n", EK());return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/719343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL - 联表查询从表即使有索引依然 ALL 的一个原因

问题描述 今天排查 MySQL 语句性能发现&#xff0c;主外键都添加索引了&#xff0c;为什么 explain 分析 type ALL&#xff1f; 原因分析 主表和从表的关联字段的编码方式不一样&#xff0c;改成一样的编码方式即可 解决方案 # 修改某张表某字段编码 ALTER TABLE t_xxx CHA…

STM32CubeMX实战教程: TIM6、TIM7 - 基本定时器

目录 一、基本定时器的作用 二、常用型号的TIM时钟频率 三、CubeMX配置 四、编写执行代码 一、基本定时器的作用 基本定时器&#xff0c;主要用于实现定时和计数功能。作用包括&#xff1a; 定时功能&#xff1a;可以产生周期性的中断&#xff0c;用于实现定时任务。例如&…

什么是Docker容器?

Docker是一种轻量级的虚拟化技术&#xff0c;同时是一个开源的应用容器运行环境搭建平台&#xff0c;可以让开发者以便捷方式打包应用到一个可移植的容器中&#xff0c;然后安装至任何运行Linux或Windows等系统的服务器上。相较于传统虚拟机&#xff0c;Docker容器提供轻量化的…

【C++通关攻略 · 基础篇】输入输出语句

目录 输入语句 原理 什么是流&#xff1f; 语法 补充 输出语句 原理 语法 补充 示例 输入语句 输入语句&#xff0c;就是用来接受用户输入的内容。比如用户在控制台输入一个数字&#xff0c;就可以用输入语句去就收。 原理 在 C 中&#xff0c;cin 就是最常用的输入…

linux安装mysql5.7

linux安装mysql5.7 一、下载mysql5.7二、解压包介绍三、上传包到linux四、卸载mariadb五、安装mysql六、修改权限七、启动mysql八、使用过navicat创作不易&#xff0c;笔记不易&#xff0c;如觉不错&#xff0c;请三连&#xff0c;谢谢~~ 一、下载mysql5.7 去mysql官方下载&am…

MES系统在离散制造企业中的功能解析

随着信息技术的快速发展和制造业的转型升级&#xff0c;MES在离散制造企业中的作用日益凸显。MES系统不仅提高了生产效率和产品质量&#xff0c;还优化了资源配置&#xff0c;增强了企业的市场竞争力。 一、生产管理功能 MES系统能够实时监控生产现场的各种数据&#xff0c;包…

二叉搜索树题目:将有序数组转换为二叉搜索树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法证明代码复杂度分析 题目 标题和出处 标题&#xff1a;将有序数组转换为二叉搜索树 出处&#xff1a;108. 将有序数组转换为二叉搜索树 难度 4 级 题目描述 要求 给定整数数组 nums \texttt{nums}…

一、低代码平台-数据库设计规范

数据库设计规范目的 a、规格化管理各个业务数据表 b、通过字段名称快速了解表与表之间的关联关系 c、通过字段第一位快速了解字段数据类型等等所有规范都为了更好的开发与后期系统运维。 1、数据库设计规范 答&#xff1a;数据库安装必须选择大小写敏感&#xff1b;编码格式…

15 easy 141. 环形链表

法1&#xff1a;快慢指针法&#xff1a; //给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 // // 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数…

Python爬虫副业真的可行吗?

首先回答你&#xff0c;是可行的&#xff0c;python爬虫能当副业&#xff0c;副业的方式比较多&#xff0c;等下我会讲几种。 那学到哪个层次可以接单呢&#xff1f;主要看你是接什么样的单&#xff0c;爬一些资料&#xff0c;视频这种简单的学一两个月就没什么问题&#xff0…

第一天 走进Docker的世界

第一天 走进Docker的世界 介绍docker的前世今生&#xff0c;了解docker的实现原理&#xff0c;以Django项目为例&#xff0c;带大家如何编写最佳的Dockerfile构建镜像。通过本章的学习&#xff0c;大家会知道docker的概念及基本操作&#xff0c;并学会构建自己的业务镜像&…

一文读懂Persistence One- 如何将Restaking带入Cosmos

Persistence One正在将Restaking引入Cosmos。用户将能够通过pSTAKE、Stride、Quicksilver和Milkyway将Liquid Staked Tokens&#xff08;如ATOM、TIA、DYDX等&#xff09;存入Persistence One&#xff0c;对其进行Restaking&#xff0c;从而安全地连接更多区块链&#xff0c;首…

MySQL:数据库中有哪些锁

1、全局锁 加上全局锁后整个数据库就处于只读状态了&#xff0c;这时其他线程执行以下操作&#xff0c;都会被阻塞&#xff1a; 对数据的增删改操作&#xff0c;比如 insert、delete、update等语句&#xff1b;对表结构的更改操作&#xff0c;比如 alter table、drop table 等…

Android APK包反编译为java文件教程

方法 流程&#xff1a; test.apk -> smali文件 -> dex文件 -> jar文件 ->java 文件 将APK包解压为 smail文件 下载 apktool工具 apktool.jar 将 test.apk 和 apktool.jar放同一目录下&#xff0c;并执行以下命令 java -jar apktool.jar d -f xxx.apk -o xxx(解…

【如何像网吧一样弄个游戏菜单在家里】

GGmenu 个人家庭版游戏、应用管理 桌面图标管理器

[环境配置]ssh连接报错“kex_exchange_identification: read: Connection reset by peer”

已经被VScode ssh毒死好几次了&#xff0c;都是执行命令意外中断&#xff0c;然后又VSCode里连不上、本机Terminal也连不上了。。。 重启远程服务器&#xff0c;VSCode可以连上了&#xff0c; 系统ssh还是不行&#xff0c;报错“kex_exchange_identification: read: Connecti…

容器(JAVA基础)

一.泛型 在Java中,泛型(Generics)是JDK 5.0引入的一个新特性,它允许在定义类、接口和方法时使用类型参数(type parameters)。类型参数在使用前必须先被实际类型(如Integer、String等)替代,这个过程称作类型实例化或类型擦除。泛型提供了编译时类型安全,减少了运行时…

CSS~~

CSS是一门语言&#xff0c;用于控制网页表现 CSS(Cascading Style Sheet):层叠样式表 W3C标准:网页主要由三部分组成 结构:HTML 表现: CSS 行为:JavaScript 1&#xff0c;CSS的导入方式 &#xff08;1&#xff09;内联样式 在标签内部使用style属性&#xff0c;属性值是cs…

类 Unix 系统的文件目录结构

以下是类 Unix 系统的文件目录结构、各个目录主要存放的文件以及缩写的全称的详细说明&#xff1a; 根目录 /&#xff1a; 全称: Root Directory说明&#xff1a;根目录是整个文件系统的起点&#xff0c;包含了所有其他目录和文件。 /bin 目录&#xff1a; 全称: Binary说明&a…

Nginx最常用的指令

服务管理 sudo systemctl status nginx # nginx当前状态 sudo systemctl reload nginx # 重新加载 nginx sudo systemctl restart nginx # 重启nginxsudo nginx -t # 检查语法 nginx # 启动 nginx -s reload # 重启 nginx -s stop # 关闭进程 nginx -s quit #…