739. [网络流24题] 运输问题 费用流/求最大最小值
来源:互联网 发布:基金规模 知乎 编辑:程序博客网 时间:2024/05/16 13:49
- [网络流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
简单的最大流求最值问题
#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-1void 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;}
阅读全文
0 0
- 739. [网络流24题] 运输问题 费用流/求最大最小值
- [网络流24题] 17 运输问题(网络费用流量,最小费用最大流)
- 线性规划与网络流24题の17 运输问题(最小费用最大流、最大费用最大流)
- Cogs 739. [网络流24题] 运输问题(费用流)
- 网络流24题 运输问题 最小费用最大流 模版
- 732. [网络流24题] 试题库 费用流/最大最小值
- 【费用流】【网络流24题】【cogs 739】运输问题
- [网络流24题][CODEVS1914]运输问题(费用流)
- 740. [网络流24题] 分配问题 费用流/求最大最小费用
- 【最小费用最大流】运输问题
- 运输问题 最小费用最大流
- 【loj】#6011. 「网络流 24 题」运输问题(最小费用流)
- loj6011「网络流 24 题」运输问题(费用流)
- [最小费用最大流算法]运输问题4
- 线性规划与网络流24题の18 分配问题(最小费用最大流、最大费用最大流)
- [网络流24题 #17]运输问题
- 网络流24题:运输问题
- 【网络流24题】运输问题
- mongoose增删改查
- Longest Prefix Gym101498B
- 改变input中的值
- html5/Css3 做一个网页康宁家具
- JAVA AQS抽象队列同步器详解
- 739. [网络流24题] 运输问题 费用流/求最大最小值
- 重写与重载
- JS获取URL中参数值(QueryString)的4种方法
- 数值的整数次方
- Linux和win10双系统导致win10时间错误的问题
- ssh 仍然需要密码
- Unity3D获得Android和iOS设备的唯一标识
- linux tomcat命令基本使用
- FormData的使用