739. [网络流24题] 运输问题 费用流/求最大最小值
2017-09-21 08:48
447 查看
[网络流24题] 运输问题
★★☆ 输入文件:tran.in 输出文件:tran.out 简单对比
时间限制:1 s 内存限制:128 MB
«问题描述:
«编程任务:
对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运
输方案。
«数据输入:
«结果输出:
程序运行结束时,将计算出的最少运输费用和最多运输费用输出到文件tran.out中。
输入文件示例 输出文件示例
tran.in
2 3
220 280
170 120 210
77 39 105
150 186 122
tran.out
48500
69140
对于所有数据:1<=N,M<=100
★★☆ 输入文件:tran.in 输出文件:tran.out 简单对比
时间限制:1 s 内存限制:128 MB
«问题描述:
«编程任务:
对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运
输方案。
«数据输入:
«结果输出:
程序运行结束时,将计算出的最少运输费用和最多运输费用输出到文件tran.out中。
输入文件示例 输出文件示例
tran.in
2 3
220 280
170 120 210
77 39 105
150 186 122
tran.out
48500
69140
对于所有数据:1<=N,M<=100
简单的最大流求最值问题
#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("tran.in","r",stdin); freopen("tran.out","w",stdout); // freopen("data.txt","r",stdin); // scanf("%d", &T); // while(T--) // { // // } int sum = 0; int ss,tt; scanf("%d%d", &m, &n); ss=0,tt=m+n+1; init(500); for(int i=1;i<=m;i++) { scanf("%d",&a[i]); sum+=a[i]; addedge(0,i,a[i],0); // for(int j=k+1;j<=k+m;j++) // { // addEdge(i,j,1); // } } for(int j=m+1;j<=n+m;j++) { scanf("%d",&b[j]); addedge(j,tt,b[j],0); // for(int i=0;i<t;i++) // { // scanf("%d",&w); // addEdge(w,j,1); // } } for(int i = 1 ;i <= m; i++) { for(int j = 1;j <= n; j++) { scanf("%d",&c[i][j]); addedge(i,j+m,INF,c[i][j]); } } int cost =0 ; minCostMaxflow(ss, tt,cost); printf("%d\n",cost); init(500); for(int i=1;i<=m;i++) { addedge(0,i,a[i],0); // for(int j=k+1;j<=k+m;j++) // { // addEdge(i,j,1); // } } for(int j=m+1;j<=n+m;j++) { addedge(j,tt,b[j],0); // for(int i=0;i<t;i++) // { // scanf("%d",&w); // addEdge(w,j,1); // } } for(int i = 1 ;i <= m; i++) { for(int j = 1;j <= n; j++) { addedge(i,j+m,INF,-c[i][j]); } } minCostMaxflow(ss, tt,cost); printf("%d\n",-cost); // if(Maxflow(ss, tt)<sum) // { // printf("NoSolution!\n"); // } // else // { // // for(int i=1;i<=k;i++) // { // printf("%d:",i); // for(int j = head[i]; j != -1; j = edge[j].next) // { // if(edge[j].flow==1) // { // printf("%d ",edge[j].to-k); // // } // } // printf("\n"); // } // // // } return 0; }
相关文章推荐
- 739. [网络流24题] 运输问题
- cogs739. [网络流24题] 运输问题
- Cogs 739. [网络流24题] 运输问题(费用流)
- 【网络流24题】分配问题 最小最大费用最大流
- 网络流24题 太空飞行计划问题___最大权闭合子图
- 线性规划与网络流24题之分配问题 最大费用最大流、最小费用最大流、二分图的最佳匹配
- [网络流24题] COGS 运输问题1
- 【网络流24题】骑士共存问题(最大流)
- loj6011「网络流 24 题」运输问题
- 【网络流24题】No. 13 星际转移问题 (网络判定 最大流)
- LOJ6011「网络流 24 题 - 12」运输问题 坠小费用坠大流 坠大费用坠大流
- [网络流24题] COGS 运输问题1
- Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)
- 【费用流】【网络流24题】【cogs 739】运输问题
- 【网络流24题】运输问题
- [网络流24题] 17 运输问题(网络费用流量,最小费用最大流)
- 【网络流24题】试题库问题(最大流)
- [网络流24题][CODEVS1914]运输问题(费用流)
- 「网络流 24 题」运输问题
- [网络流24题] 方格取数问题 (最大点权独立集)