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 ;
}

最新文章

  1. mysql中distinct的用法
  2. C中嵌入python
  3. 一个简单的c# 贪吃蛇程序
  4. C#处理Json文件
  5. Ms sql server sql优化技巧
  6. java.lang.ThreadLocal源码分析
  7. 【Android - 进阶】之事件分发机制
  8. JQuery DataTable插件
  9. New UWP Community Toolkit - RangeSelector
  10. Java并发之CountDownLatch工具类
  11. springcloud-hystrix断路器对微服务的容错处理
  12. c++面试题一
  13. C# ACtiveMQ 收发数据
  14. ef linq 中判断实体中是否包含某集合
  15. 虚拟机三种网络模式详解(Bridge,Nat,Host-only)
  16. 粒子群算法(PSO)关于参数w的一些改进方法
  17. 「Vue」自定义按键修饰符
  18. C# 解决datatable写入文件内存溢出问题
  19. Cuteftp连接虚拟机Centos7
  20. Gogent相关问题的解决(不断更新)

热门文章

  1. 【spring 国际化】springMVC、springboot国际化处理详解
  2. 微信群里一道六年级数学题,求阴影面积,那我只能用python代码了
  3. 记一次错误 POST http://127.0.0.1:8000/auth/signup/ 500 (Internal Server Error)
  4. Daily Scrum 12/18/2015
  5. vue中SPA的优缺点和理解
  6. redis和memcache列出所有key
  7. Linux 常用到的命令
  8. 如何使用Jsoup爬取网页内容
  9. Python数据分析入门与实践 学习
  10. Deepin15.11-mysql5.7安装与配置