P4016 负载平衡问题 网络流

P4016 负载平衡问题

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 const int maxn = 1005, inf = 0x3f3f3f3f;
  4 struct Edge {
  5     int from, to, cap, flow, cost;
  6 };
  7
  8 struct MCMF {
  9     int n, m, s, t;
 10     vector<Edge> edges;
 11     vector<int> G[maxn];
 12     int inq[maxn];
 13     int d[maxn];
 14     int p[maxn];
 15     int a[maxn];
 16
 17     void init(int n) {
 18         this->n = n;
 19         for (int i = 1; i <= n; ++i) G[i].clear();
 20         edges.clear();
 21     }
 22
 23     void AddEdge(int from, int to, int cap, int cost) {
 24         edges.push_back((Edge){from, to, cap, 0, cost});
 25         edges.push_back((Edge){to, from, 0, 0, -cost});
 26         m = edges.size();
 27         G[from].push_back(m-2);
 28         G[to].push_back(m-1);
 29     }
 30     bool BellmanFord(int s, int t, int& flow, int& cost) {
 31         for (int i = 1; i <= n; ++i) d[i] = inf;
 32         memset(inq, 0, sizeof(inq));
 33         d[s] = 0; inq[s] = 1; p[s] = 0; a[s] = inf;
 34
 35         queue<int> que;
 36         que.push(s);
 37         while (!que.empty()) {
 38             int u = que.front(); que.pop();
 39             inq[u] = 0;
 40             for (int i = 0; i < G[u].size(); ++i) {
 41                 Edge& e = edges[G[u][i]];
 42                 if (e.cap > e.flow && d[e.to] > d[u] + e.cost) {
 43                     d[e.to] = d[u] + e.cost;
 44                     p[e.to] = G[u][i];
 45                     a[e.to] = min(a[u], e.cap-e.flow);
 46                     if (!inq[e.to]) { que.push(e.to); inq[e.to] = 1; }
 47                 }
 48             }
 49         }
 50         if (d[t] == inf) return false;
 51         flow += a[t];
 52         cost += d[t] * a[t];
 53         int u = t;
 54         while (u != s) {
 55             edges[p[u]].flow += a[t];
 56             edges[p[u]^1].flow -= a[t];
 57             u = edges[p[u]].from;
 58         }
 59         return true;
 60     }
 61     int mincost(int s, int t) {
 62         int flow = 0, cost = 0;
 63         while (BellmanFord(s, t, flow, cost));
 64         return cost;
 65     }
 66 }mcmf;
 67 int a[maxn];
 68 int main() {
 69     int n; scanf("%d",&n);
 70     int s = n+1, t = n+2, ave = 0;
 71     mcmf.init(n+2);
 72     for (int i = 1; i <= n; ++i) {
 73         scanf("%d",&a[i]);
 74         ave += a[i];
 75     }
 76     ave /= n;
 77     for (int i = 1; i <= n; ++i) {
 78         /// 如果仓库量小于平均值,则说明要从源点流入到该仓库
 79         if (a[i] < ave) mcmf.AddEdge(s,i,ave-a[i],0);
 80         /// 如果仓库量大于平均值,则说明要从该仓库流出到汇点
 81         if (a[i] > ave) mcmf.AddEdge(i,t,a[i]-ave,0);
 82     }
 83     /// 相邻点之间建立关系
 84     for (int i = 1; i <= n; ++i) {
 85         if (i == 1) {
 86             mcmf.AddEdge(i,i+1,inf,1);
 87             mcmf.AddEdge(i,n,inf,1);
 88             continue;
 89         }
 90         if (i == n) {
 91             mcmf.AddEdge(i,1,inf,1);
 92             mcmf.AddEdge(i,i-1,inf,1);
 93         }
 94         mcmf.AddEdge(i,i+1,inf,1);
 95         mcmf.AddEdge(i,i-1,inf,1);
 96     }
 97     int ans = mcmf.mincost(s,t);
 98     printf("%d\n",ans);
 99     return 0;
100 }

原文地址:https://www.cnblogs.com/wstong/p/11801461.html

时间: 2024-10-11 08:44:35

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

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

题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格式: 文件的第 11 行中有 11 个正整数 nn ,表示有 nn 个仓库. 第 22 行中有 nn 个正整数,表示 nn 个仓库的库存量. 输出格式: 输出最少搬运量. 输入输出样例 输入样例#1: 复制 5 17 9 14 16 4 输出样例#1: 复制 11 说明 1 \leq n \leq

P2512 [HAOI2008]糖果传递&amp;&amp;P3156 [CQOI2011]分金币&amp;&amp;P4016 负载平衡问题

P2512 [HAOI2008]糖果传递 第一步,当然是把数据减去平均数,然后我们可以得出一串正负不等的数列 我们用sum数组存该数列的前缀和.注意sum[ n ]=0 假设为链,那么可以得出答案为abs( sum[ 1 ] )+abs( sum[ 2 ] )+...+abs( sum[ n ] ) 但是题目说的是环 我们设在第 k 个人处断开环成链. 那么答案为 abs( sum[ k+1 ] - sum[ k ] )+abs( sum[ k+2 ] - sum[ k ] )+...+abs(

P2512 [HAOI2008]糖果传递 &amp; P4016 负载平衡问题

神奇的中位数定理!(名字自己起的) 两个题目都是一个问题:\(n\)个人围成一圈,每个人可以给她左右两个人金币,求最小的金币交换量使得他们的金币都一样多. 鉴于不会那些费用流,就学了神奇的数学方法.(其实蓝书里面有类似的题目) 所谓的数学方法是这样的: 设\(A_i\)为第\(i\)个人一开始持有的金币数,\(X_i\)为第\(i\)个人给她下一个人的金币量(正数说明是给人的,负数说明是别人给自己的). 那么最终的答案其实就是\(\sum_{i=1}^n |X_i|\). 那么可以列出\(n\)

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 个

pfsense Web服务器负载平衡配置示例

在pfsense的网关和服务器中有两种类型的负载平衡功能.网关负载平衡可以通过多个WAN连接分发Internet绑定的流量.服务器负载平衡管理传入流量,因此它利用多个内部服务器进行负载分配和冗余,服务器负载平衡允许流量在多个内部服务器之间分配,它最常用于Web服务器和SMTP服务器.下面我们就以实例来介绍服务器负载平衡的设置. 下面介绍如何通过pfsense2.32配置Web服务器的负载平衡. 网络环境 服务器负载平衡示例网络环境 上图为示例网络环境.它由单个防火墙组成,使用其WAN IP地址池

Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台 Seesaw

负载均衡系统 Seesaw Seesaw是由我们网络可靠性工程师用 Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台,就像所有好的项目一样,这个项目也是为了解决实际问题而产生的. Seesaw发布的博客中这样写道:“我们需要能够处理单播(unicast)和任播(anycast)虚拟 IP (VIPs) 流量,使用 NAT 和 DSR (也被称为 DR) 执行负载均衡,执行针对后端的健康检查.特别是,我们需要一个容易管理的平台,可以自动部署配置的变化.在评估了一些包括现有的开源项目的平台

微软Azure云之企业Exchange 2016部署12&mdash;配置负载平衡

上几节我们把Exchange2016邮箱系统配置完毕了,本节我们来配置开通需要对外的端口,并对这些端口进行负载均衡配置,如下图红框所示: 1.Exchange服务端口 Exchange2016需要对外开通以下的端口,来对外提供不同的服务: 其中最主要的事HTTPS(443)端口,以下服务需要用到此端口: 自动发现服务 Exchange ActiveSync Exchange Web 服务 (EWS) 脱机通讯簿 Outlook 无处不在 MAPI over HTTP in Exchange 20

Windows Server 2008 R2 负载平衡入门篇

一.简单介绍负载均衡 负载均衡也称负载共享,它是指负载均衡是指通过对系统负载情况进行动态调整,把负荷分摊到多个操作节点上执行,以减少系统中因各个节点负载不均衡所造成的影响,从而提高系统的工作效率.在常用的大型服务器系统当中都存在着负载均衡组件,常用的像微软的网络负载平衡NLB.甲骨文的Oracle RAC.思科的负载均衡(SLB),Apach+Tomcat 负载均衡,它们能从硬件或软件不同方面实现系统各节点的负载平衡,有效地提高大型服务器系统的运行效率,从而提升系统的吞吐量.本篇文章以微软的网络

企业级负载平衡简介

在之前的一篇文章<放好你的密码 - 从芝麻金融被攻破说起>中,一位读者在评论中提出了“如果整个过程速度比较慢登陆会有问题”这样一条评论.虽然说我对文章的正确性很有把握,但也仍需要仔细思考是否自己哪里没有说清楚.在这个思考过程中,我想起了一个非常值得一说的话题,那就是负载平衡. 在那篇文章中我们说到,要安全地管理好密码,计算密码哈希所使用的迭代次数应该尽可能地大,从而使得单次哈希计算的速度变长,增加恶意人员破解密码的难度.反过来,如果有一百个人或者一千个人同时执行登陆操作,那么这么繁琐的哈希计算