[CODEVS1916] 负载平衡问题(最小费用最大流)
输入所有 a[i],求出平均值 sum,每个 a[i] -= sum
那么如果 a[i] > 0,从 s 向 i 连一条容量为 a[i] 费用为 0 的有向边
如果 a[i] < 0,从 i 向 t 连一条容量为 -a[i] 费用为 0 的有向边
每个点 i 和它相邻的两个点连一条容量为 INF 费用为 1 的有向边
求出最小费用最大流即为答案
——代码
- #include <queue>
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #define INF 1e9
- #define N 1000001
- #define min(x, y) ((x) < (y) ? (x) : (y))
- int n, cnt, s, t;
- int a[], dis[N], pre[N];
- int head[N], to[N << ], val[N << ], cost[N << ], next[N << ];
- bool vis[N];
- inline int read()
- {
- int x = , f = ;
- char ch = getchar();
- for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
- for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
- return x * f;
- }
- inline void add(int x, int y, int z, int c)
- {
- to[cnt] = y;
- val[cnt] = z;
- cost[cnt] = c;
- next[cnt] = head[x];
- head[x] = cnt++;
- }
- inline bool spfa()
- {
- int i, u, v;
- std::queue <int> q;
- memset(vis, , sizeof(vis));
- memset(pre, -, sizeof(pre));
- memset(dis, / , sizeof(dis));
- q.push(s);
- dis[s] = ;
- while(!q.empty())
- {
- u = q.front(), q.pop();
- vis[u] = ;
- for(i = head[u]; i ^ -; i = next[i])
- {
- v = to[i];
- if(val[i] && dis[v] > dis[u] + cost[i])
- {
- dis[v] = dis[u] + cost[i];
- pre[v] = i;
- if(!vis[v])
- {
- q.push(v);
- vis[v] = ;
- }
- }
- }
- }
- return pre[t] ^ -;
- }
- inline int dinic()
- {
- int i, d, sum = ;
- while(spfa())
- {
- d = INF;
- for(i = pre[t]; i ^ -; i = pre[to[i ^ ]]) d = min(d, val[i]);
- for(i = pre[t]; i ^ -; i = pre[to[i ^ ]])
- {
- val[i] -= d;
- val[i ^ ] += d;
- }
- sum += dis[t] * d;
- }
- return sum;
- }
- int main()
- {
- int i, j, x, sum = ;
- n = read();
- s = , t = n + ;
- memset(head, -, sizeof(head));
- for(i = ; i <= n; i++)
- {
- a[i] = read();
- sum += a[i];
- }
- sum /= n;
- for(i = ; i <= n; i++) a[i] -= sum;
- for(i = ; i <= n; i++)
- {
- if(a[i] > ) add(s, i, a[i], ), add(i, s, , );
- if(a[i] < ) add(i, t, -a[i], ), add(t, i, , );
- if(i == )
- {
- add(i, , INF, ), add(, i, , -);
- add(i, n, INF, ), add(n, i, , -);
- }
- else if(i == n)
- {
- add(i, n - , INF, ), add(n - , i, , -);
- add(i, , INF, ), add(, i, , -);
- }
- else
- {
- add(i, i + , INF, ), add(i + , i, , -);
- add(i, i - , INF, ), add(i - , i, , -);
- }
- }
- printf("%d\n", dinic());
- return ;
- }
[CODEVS1916] 负载平衡问题(最小费用最大流)的更多相关文章
- P4016 负载平衡问题(最小费用最大流)
P4016 负载平衡问题 题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬 ...
- 洛谷P4016 负载平衡问题(最小费用最大流)
题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格 ...
- Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)
Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...
- LibreOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题
#6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- 洛谷 P4016 负载平衡问题 【最小费用最大流】
求出平均数sum,对于大于sum的点连接(s,i,a[i]-sum,0),表示这个点可以流出多余的部分,对于小于sum的点连接(i,t,sum-a[i],0)表示这个点可以接受少的部分,然后每个点向相 ...
- 【PowerOJ1754&网络流24题】负载平衡问题(费用流)
题意: 思路: [问题分析] 转化为供求平衡问题,用最小费用最大流解决. [建模方法] 首先求出所有仓库存货量平均值,设第i个仓库的盈余量为A[i],A[i] = 第i个仓库原有存货量 - 平均存货量 ...
- BZOJ-1061 志愿者招募 线性规划转最小费用最大流+数学模型 建模
本来一眼建模,以为傻逼题,然后发现自己傻逼...根本没想到神奇的数学模型..... 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 ...
- BZOJ 1061 志愿者招募(最小费用最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1061 题意:申奥成功后,布布经过不懈努力,终于 成为奥组委下属公司人力资源部门的主管.布 ...
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
随机推荐
- Mongodb之failed to create service entry worker thread
Mongodb "failed to create service entry worker thread" 错误. 系统:CentOS release 6.8 mongod.lo ...
- NOIP模拟赛 麻将
[题目描述] 众所周知,麻将是我们国家的国粹.这段时间,小D也迷上了麻将这个老少皆宜的游戏. 小D觉得这些不同规则的麻将太麻烦了,所以他集合了很多种麻将规则创造出了一套D麻将.下面是D麻将的几个特点: ...
- 【数学 思维题】HDU4473Exam
过程很美妙啊 Problem Description Rikka is a high school girl suffering seriously from Chūnibyō (the age of ...
- 02等待单个线程返回WaitForSingleObject
windows 多线程之等待线程返回 多线程编程中,有时我们需要等待某一线程完成了特定的操作之后再继续做其他事情,要实现这个目的,可以使用 Windows API 函数 WaitForSingle ...
- 【Python高级工程师之路】入门+进阶+实战+爬虫+数据分析整套教程
点击了解更多Python课程>>> 全网最新最全python高级工程师全套视频教程学完月薪平均2万 什么是Python? Python是一门面向对象的编程语言,它相对于其他语言,更加 ...
- Python简单试题2
1,给定一组数据,将奇数进行从小到大排序,偶数在原位置不变 例: 原数据:[5, 3, 2, 8, 1, 4] 排序后:[5, 3, 2, 8, 1, 4] 若数组为空,则返回空数组. 代码如下: ...
- 用Python对微信好友进行简单统计分析,获取好友的基本信息!
早些日子有人问我我的微信里面有一共多少朋友,我就随后拉倒了通讯录最下面就找到了微信一共有多少位好友.然后他又问我,这里面你认识多少人?这一句话问的我很无语.一千多个好友我真的不知道认识的人有多少. ...
- LightOj:1422-Halloween Costumes
传送门:http://www.lightoj.com/volume_showproblem.php?problem=1422 Halloween Costumes problem descriptio ...
- poj 1995 快速幂
题意:给出A1,…,AH,B1,…,BH以及M,求(A1^B1+A2^B2+ … +AH^BH)mod M. 思路:快速幂 实例 3^11 11=2^0+2^1+2^3 => 3^1*3 ...
- HDU 5525 Product 数论
题意: 给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(A_i\),\(N=\prod\limits_{i=1}^{n}i^{A_i}\).求\(N\)的所有约数的乘积. 分 ...