P4016 负载平衡问题 网络流重温
P4016 负载平衡问题
这个题目现在第二次做,感觉没有这么简单,可能是我太久没有写这种题目了,基本上都忘记了,所以我连这个是费用流都没有看出来。
有点小伤心,知道是费用流之后,我居然还拆点了。
这个写完之后确实感觉没有那么难,但是写的过程还是很艰辛的,这个为什么是一个费用流呢,
因为我们知道每移动一个单位的货物,就会产生一单位的费用,所以这个就是费用流。
再而为什么这个不要拆点呢,因为每一个点都是只有一种属性,要么就是多了要输出,要么就是少了要进入,这个其实我也有点不是很清楚。
还没有完全弄明白。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <string>
#include <iostream>
#include <vector>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 3e5 + ;
typedef long long ll;
struct edge
{
int u, v, c, f, cost;
edge(int u=,int v=,int c=,int f=,int cost=):u(u),v(v),c(c),f(f),cost(cost){}
};
vector<edge>e;
vector<int>G[maxn];
int a[maxn], p[maxn], inq[maxn], d[maxn], n, m;
void init(int n)
{
for (int i = ; i <= n; i++) G[i].clear();
e.clear();
}
void addedge(int u,int v,int c,int cost)
{
e.push_back(edge(u, v, c, , cost));
e.push_back(edge(v, u, , , -cost));
int m = e.size();
G[u].push_back(m - );
G[v].push_back(m - );
}
bool spfa(int s,int t,int &flow,ll &cost)
{
memset(d, inf, sizeof(d));
memset(inq, , sizeof(inq));
d[s] = , inq[s] = ;
p[s] = , a[s] = inf;
queue<int>que;
que.push(s);
while(!que.empty())
{
int u = que.front(); que.pop();
inq[u] = ;
for(int i=;i<G[u].size();i++)
{
edge &now = e[G[u][i]];
int v = now.v;
if(now.c>now.f&&d[v]>d[u]+now.cost)
{
d[v] = d[u] + now.cost;
p[v] = G[u][i];
a[v] = min(a[u], now.c - now.f);
if (!inq[v]) que.push(v), inq[v] = ;
}
}
}
if (d[t] == inf) return false;
flow += a[t];
cost += d[t] * 1ll * a[t];
for(int u=t;u!=s;u=e[p[u]].u)
{
e[p[u]].f += a[t];
e[p[u] ^ ].f -= a[t];
}
return true;
} int MincostMaxflow(int s,int t,ll &cost)
{
cost = ;
int flow = ;
while (spfa(s, t, flow, cost));
return flow;
} int main() {
int n, sum = ;
scanf("%d", &n);
for (int i = ; i <= n; i++) scanf("%d", &a[i]), sum += a[i];
sum /= n;
int s = , t = n + ;
for(int i=;i<=n;i++)
{
if (a[i] > sum) addedge(s, i, a[i] - sum, );
else addedge(i, t, sum - a[i], );
if(i==)
{
addedge(, , inf, );
addedge(, n, inf, );
}
else if(i==n)
{
addedge(n, , inf, );
addedge(n, n - , inf, );
}
else
{
addedge(i, i + , inf, );
addedge(i, i - , inf, );
}
}
ll ans = ;
MincostMaxflow(s, t, ans);
printf("%lld\n", ans);
return ;
}
P4016 负载平衡问题 网络流重温的更多相关文章
- P4016 负载平衡问题 网络流
P4016 负载平衡问题 题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运 ...
- 洛谷 P4016负载平衡问题【费用流】题解+AC代码
洛谷 P4016负载平衡问题 P4014 分配问题[费用流]题解+AC代码 负载平衡问题 题目描述 GG 公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n ...
- Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)
Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...
- P4016 负载平衡问题(最小费用最大流)
P4016 负载平衡问题 题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬 ...
- 洛谷P4016负载平衡
题目 负载平衡问题是一个比较经典的网络流问题,但是该问题还有一个数学贪心法. 所以做这个题前,其实可以做一下均分纸牌问题. 均分纸牌问题 均分纸牌问题可以说是作为贪心的入门题. 做法 首先我们应当把原 ...
- 洛谷 [P4016] 负载平衡问题
贪心做法 第一眼看见觉得和均分纸牌差不多,然而因为这是环形的,并不能用均分纸牌的方法做,但是均分纸牌的思想仍然适用 首先我们假设平均数为sum1. 那么对于第1个人,我们假设他给第N个人K个糖果, 第 ...
- Luogu P4016 负载平衡问题
传说中的网络流24题之一,我刷的第二题菜. 据说这种东西做完了就可以有质的飞越?不过看着这些Luogu评级就有点蒙蔽. 首先我们看一下题目发现这不是均分纸牌的加强板吗,但是那个环的操作极大地限制了我的 ...
- P4016 负载平衡问题
题目描述 G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格式: 文 ...
- (洛谷P2512||bzoj1045) [HAOI2008]糖果传递 || 洛谷P4016 负载平衡问题 || UVA11300 Spreading the Wealth || (洛谷P3156||bzoj3293) [CQOI2011]分金币
bzoj1045 洛谷P4016 洛谷P2512 bzoj3293 洛谷P3156 题解:https://www.luogu.org/blog/LittleRewriter/solution-p251 ...
随机推荐
- pgsql的使用
Deepin上面pgsql的启动 service postgresql start 停止 service postgresql stop 查看pgsql的版本 psql --version
- 设置xml以让通知spring 扫描 注解
<!--下边三个都是告诉spring扫描注解--> 一.<context:component-scan base-package="log.logback"/&g ...
- CNVD
漏洞编号 漏洞名称 漏洞积分 奖励时间 CNVD-2020-15798 中国平乐县委员会组织部网站管理系统登录存在弱口令漏洞 1.0 2020-03-09 09:58:46.0 CNVD-2020-1 ...
- 传智博客2015年最新版iOS基础视频_最适合初学者入门
视频介绍: 本视频是iOS学院精心录制的免费精华版iOS语言基础视频,该视频特点在于最大程度保证了知识点的完整性,按知识点进行视频录制,每个视频控制在20分钟左右,不会使学生产生疲劳,授课讲究通俗易懂 ...
- AJ学IOS 之微博项目实战(6)导航控制器NavigationController 的滑动回退功能实现
AJ分享,必须精品 一:效果 第二篇里面写了怎样自定义navigation实现自定义的导航控制器左右按钮样式,但是当我们自己实现后,系统自带的向右边滑动来实现回退的功能就不能用了. 这里主要实现滑动回 ...
- Git敏捷开发--reset和clean
reset 丢弃本地所有修改,强行和上游分支保持一致 git reset --hard HEAD 若仅丢弃某个文件的改动,利用checkout git checkout your_file clean ...
- 使用HTMLTestRunner生成报告
使用HTMLTestRunner生成报告 unittest本身并不具备这个功能,需要使用HTMLTestRunner库 使用步骤: 首先需要下载.py文件:http://tungwaiyip.info ...
- 词向量表示:word2vec与词嵌入
在NLP任务中,训练数据一般是一句话(中文或英文),输入序列数据的每一步是一个字母.我们需要对数据进行的预处理是:先对这些字母使用独热编码再把它输入到RNN中,如字母a表示为(1, 0, 0, 0, ...
- OAuth-授权机制
一.应用场景 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片. 问 ...
- 权威的国际敏捷认证Certified Scrum Master (CSM)
权威的国际敏捷认证Certified Scrum Master (CSM) A. 认证前 在学习Certified Scrum Master (CSM)之前,你需要了解: 什么是CSM CSM认证与其 ...