741. [网络流24题] 负载平衡 最小费用最大流/简单
来源:互联网 发布:手机报表软件下载 编辑:程序博客网 时间:2024/05/20 06:25
★★☆ 输入文件:overload.in 输出文件:overload.out 简单对比
时间限制:1 s 内存限制:128 MB
«问题描述:
G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最
少搬运量可以使n 个仓库的库存数量相同。搬运货物时,只能在相邻的仓库之间搬运。
«编程任务:
对于给定的n 个环形排列的仓库的库存量,编程计算使n 个仓库的库存数量相同的最少
搬运量。
«数据输入:
由文件overload.in提供输入数据。文件的第1 行中有1 个正整数n(n<=100),表示有n
个仓库。第2 行中有n个正整数,表示n个仓库的库存量。
«结果输出:
程序运行结束时,将计算出的最少搬运量输出到文件overload.out中。
输入文件示例 输出文件示例
overload.in
5
17 9 14 16 4
overload.out
11
相邻点建边,花费为1,然后跑最小费用最大流
#include<bits/stdc++.h> using namespace std; const int MAXN = 10000; const int MAXM = 100000; const int INF = 0x3f3f3f3f; struct Edge { int to,next,cap,flow,cost; } edge[MAXM]; int head[MAXN],tol; int pre[MAXN],dis[MAXN]; bool vis[MAXN]; int N;//节点总个数,节点编号从0~N-1 void init(int n) { N = n; tol = 0; memset(head,-1,sizeof(head)); } void addedge(int u,int v,int cap,int cost) { edge[tol].to = v; edge[tol].cap = cap; edge[tol].cost = cost; edge[tol].flow = 0; edge[tol].next = head[u]; head[u] = tol++; edge[tol].to = u; edge[tol].cap = 0; edge[tol].cost = -cost; edge[tol].flow = 0; edge[tol].next = head[v]; head[v] = tol++; } bool spfa(int s,int t) { queue<int>q; for(int i = 0; i < N; i++) { dis[i] = INF; vis[i] = false; pre[i] = -1; } dis[s] = 0; vis[s] = true; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = false; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost ) { dis[v] = dis[u] + edge[i].cost; pre[v] = i; if(!vis[v]) { vis[v] = true; q.push(v); } } } } if(pre[t] == -1)return false; else return true; } //返回的是最大流,cost存的是最小费用 int minCostMaxflow(int s,int t,int &cost) { int flow = 0; cost = 0; while(spfa(s,t)) { int Min = INF; for(int i = pre[t]; i != -1; i = pre[edge[i^1].to]) { if(Min > edge[i].cap - edge[i].flow) Min = edge[i].cap - edge[i].flow; } for(int i = pre[t]; i != -1; i = pre[edge[i^1].to]) { edge[i].flow += Min; edge[i^1].flow -= Min; cost += edge[i].cost * Min; } flow += Min; } return flow; } int a[105]; int b[105]; int c[105][105]; int T; int n,m,t; int main() { freopen("overload.in","r",stdin); freopen("overload.out","w",stdout); // freopen("data.txt","r",stdin); // scanf("%d", &T); // while(T--) // { // // } int ss,tt; scanf("%d",&n); int sum =0; ss=0,tt=n+1; init(500); for(int i=1;i<=n;i++) { scanf("%d",&t); sum+=t; addedge(0,i,t,0); } for(int i=1;i<=n;i++) { if(i!=1) addedge(i,i-1,INF,1); else addedge(i,n,INF,1); if(i!=n) addedge(i,i+1,INF,1); else addedge(i,1,INF,1); } for(int j=1;j<=n;j++) { addedge(j,tt,sum/n,0); } int cost =0 ; minCostMaxflow(ss,tt,cost); printf("%d\n",cost); return 0; }
阅读全文
0 0
- 741. [网络流24题] 负载平衡 最小费用最大流/简单
- [网络流24题] 19 负载平衡(最小代价供求,最小费用最大流)
- 线性规划于网络流24题之负载平衡问题 最小费用最大流
- 线性规划与网络流24题の19 负载平衡问题(最小费用最大流)
- 网络流24题 负载平衡 费用流
- 负载平衡问题(最小费用流)
- [网络流24题] 餐巾 最小费用最大流
- 最小费用最大流 [网络流24题] 餐巾
- [网络流24题] 17 运输问题(网络费用流量,最小费用最大流)
- [网络流24题][CODEVS1916]负载平衡问题(费用流)
- loj6013「网络流 24 题」负载平衡(费用流)
- 740. [网络流24题] 分配问题 费用流/求最大最小费用
- 线性规划与网络流24题の17 运输问题(最小费用最大流、最大费用最大流)
- 线性规划与网络流24题の18 分配问题(最小费用最大流、最大费用最大流)
- 网络最大流和最小费用流
- 网络最大流和最小费用流
- 【最大流+最小费用流】网络扩容
- 网络流 最小费用最大流问题
- webview权限
- 转载- ubuntu自动安装 nginx后 文件结构及位置
- 方华小程序带你飞
- 十六个有用的Linux命令行技巧
- HttpURLConnection详解
- 741. [网络流24题] 负载平衡 最小费用最大流/简单
- html
- ifix5.8历史曲线
- H5前端基础——HTML
- Web端解码视频流:(Part1 纯Java Script 解码[不建议大家这样做,因为普适性不强])
- 解决 Android Studio 创建项目时极其的慢的尴尬
- The activity must be exported or contain an intent-filter解决方法
- office 系列产品 -- visio 2013 / project 2013 破解工具
- spring概述