网络流24题-运输问题(费用流)

题目描述

WW 公司有 mm 个仓库和 nn 个零售商店。第 ii 个仓库有 a_iai? 个单位的货物;第 jj 个零售商店需要 b_jbj? 个单位的货物。

货物供需平衡,即\sum\limits_{i=1}^{m}a_i=\sum\limits_{j=1}^{n}b_ji=1∑m?ai?=j=1∑n?bj?。

从第 ii 个仓库运送每单位货物到第 jj 个零售商店的费用为 c_{ij}cij??? 。

试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少。

输入输出格式

输入格式:

第 11 行有 22 个正整数 mm 和 nn,分别表示仓库数和零售商店数。

接下来的一行中有 mm 个正整数 a_iai?,表示第 ii 个仓库有 a_iai?个单位的货物。

再接下来的一行中有 nn 个正整数 b_jbj?,表示第 jj 个零售商店需要 b_jbj? 个单位的货物。

接下来的 mm 行,每行有 nn 个整数,表示从第 ii 个仓库运送每单位货物到第 jj 个零售商店的费用 c_{ij}cij?。

输出格式:

两行分别输出最小运输费用和最大运输费用。

输入输出样例

输入样例

2 3
220 280
170 120 210
77 39 105
150 186 122

输出样例

48500
69140

说明

1≤n,m≤100

求最小费用直接套模板,最大费用取相反数,结果也取相反数即可

**模板来自kuangbin

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int inf=0x3f3f3f3f;
  4 const int MAXN=10000;//点的总数
  5 const int MAXM=100000;//边的总数
  6 struct Edge{
  7     int to,nxt,cap,flow,cost;
  8 }edge[MAXM];
  9 int head[MAXN],tot;
 10 int pre[MAXN],dis[MAXN];
 11 bool vis[MAXN];
 12 int N;//节点总个数,节点编号0~N-1
 13 void init()
 14 {
 15     tot=0;
 16     memset(head,-1,sizeof(head));
 17 }
 18 void addedge(int u,int v,int cap,int cost)
 19 {
 20     edge[tot].to=v;     edge[tot].cap=cap;   edge[tot].cost=cost;
 21     edge[tot].flow=0;   edge[tot].nxt=head[u];  head[u]=tot++;
 22
 23     edge[tot].to=u;     edge[tot].cap=0;    edge[tot].cost=-cost;
 24     edge[tot].flow=0;    edge[tot].nxt=head[v];     head[v]=tot++;
 25 }
 26 bool spfa(int s,int t)
 27 {
 28     queue<int>q;
 29     for(int i=0;i<N;i++)
 30     {
 31         dis[i]=inf;
 32         vis[i]=false;
 33         pre[i]=-1;
 34     }
 35     dis[s]=0;
 36     vis[s]=true;
 37     q.push(s);
 38     while(!q.empty())
 39     {
 40         int u=q.front();    q.pop();
 41         vis[u]=false;
 42         for(int i=head[u];i!=-1;i=edge[i].nxt)
 43         {
 44             int v=edge[i].to;
 45             if(edge[i].cap>edge[i].flow&&dis[v]>dis[u]+edge[i].cost)
 46             {
 47                 dis[v]=dis[u]+edge[i].cost;
 48                 pre[v]=i;
 49                 if(!vis[v])
 50                 {
 51                     vis[v]=true;
 52                     q.push(v);
 53                 }
 54             }
 55         }
 56     }
 57     if(pre[t]==-1)  return false;
 58     else            return true;
 59 }
 60 int MCMF(int s,int t,int &cost)
 61 {
 62     int flow=0;
 63     cost=0;
 64     while(spfa(s,t))
 65     {
 66         int minn=inf;
 67         for(int i=pre[t];i!=-1;i=pre[edge[i^1].to])
 68         {
 69             if(minn>edge[i].cap-edge[i].flow)
 70                 minn=edge[i].cap-edge[i].flow;
 71         }
 72         for(int i=pre[t];i!=-1;i=pre[edge[i^1].to])
 73         {
 74             edge[i].flow+=minn;
 75             edge[i^1].flow-=minn;
 76             cost+=edge[i].cost*minn;
 77         }
 78         flow+=minn;
 79     }
 80     return flow;
 81 }
 82 int c[200][200],a[200],b[200];
 83 int main()
 84 {
 85     ios::sync_with_stdio(false);
 86     cin.tie(0);cout.tie(0);
 87     int n,m;
 88     cin>>n>>m;
 89     int s=0,t=n+m+1;
 90     N=t+1;
 91     init();
 92     for(int i=1;i<=n;i++)
 93     {
 94         cin>>a[i];
 95         addedge(s,i,a[i],0);
 96     }
 97     for(int i=1;i<=m;i++)
 98     {
 99         cin>>b[i];
100         addedge(i+n,t,b[i],0);
101     }
102     for(int i=1;i<=n;i++)
103     {
104         for(int j=1;j<=m;j++)
105         {
106             cin>>c[i][j];
107             addedge(i,j+n,inf,c[i][j]);
108         }
109     }
110     int cost=0;
111     MCMF(s,t,cost);
112     cout<<cost<<endl;
113     init();
114     for(int i=1;i<=n;i++)   addedge(s,i,a[i],0);
115     for(int i=1;i<=m;i++)   addedge(i+n,t,b[i],0);
116     for(int i=1;i<=n;i++)
117     {
118         for(int j=1;j<=m;j++)
119         {
120             addedge(i,j+n,inf,-c[i][j]);
121         }
122     }
123     cost=0;
124     MCMF(s,t,cost);
125     cout<<-cost<<endl;
126     return 0;
127 }

原文地址:https://www.cnblogs.com/scott527407973/p/9861379.html

时间: 2024-10-06 18:57:51

网络流24题-运输问题(费用流)的相关文章

739. [网络流24题] 运输问题

739. [网络流24题] 运输问题 ★★   输入文件:tran.in   输出文件:tran.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述:«编程任务:对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运输方案.«数据输入:«结果输出:程序运行结束时,将计算出的最少运输费用和最多运输费用输出到文件tran.out中.输入文件示例 输出文件示例tran.in2 3220 280170 120 21077 39 105 150 186 1

[网络流24题] 运输问题

题目链接:戳我 最小费用最大流. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #define S 0 #define T n+m+1 #define MAXN 210 using namespace std; int n,m,t=1,c,f; int hea

【费用流】【网络流24题】【cogs 739】运输问题

739. [网络流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 1

【网络流24题】运输问题(费用流)(网络费用流量)

[网络流24题]运输问题 2014年3月7日1,6360 题目描述 Description W 公司有m个仓库和n 个零售商店.第i 个仓库有ai 个单位的货物:第j 个零售商店需要bj个单位的货物.货物供需平衡,即  sum(si)=sum(bj).从第i 个仓库运送每单位货物到第j 个零售商店的费用为cij .试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少.编程任务:对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运输方案. 输入描述 Inp

LiberOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题

#6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入格式 文件的第 1 11 行中有 1 11 个正整数 n nn,表示有 n nn 个仓库.第 2 22 行中有 n nn 个

【网络流24题】餐巾计划问题(最小费用最大流)

[网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 因为新买餐巾没有任何限制,并且随时可以买 所以直接从源点向每一天连边,容量为INF,费用为餐巾的价格 因为流要流出去,所以每个点向汇点连边,容量为每天的用量,费用为0 第二种,旧的拿去洗 首先考虑一下怎么算有多少旧的餐巾 每天用旧的餐巾的数量值一定的,不可能变多 因此从源点向这些点连边,容量为每天

【网络流24题】航空线路问题(费用流)

[网络流24题]航空线路问题(费用流) 题面 Cogs数据有误,提供洛谷题面 题解 这题和原来做过的一道题周游加拿大是一模一样的 所以,这题DP+记录方案应该也是可行的 来考虑网络流的做法 现在的来回,被看成是去两次 所以流量被限定死了,为2 因此要考虑费用流来求解. 每个点只能经过一次 很显然先拆点 如果一个城市被访问了 那么,他的两个点直接的流量是一定存在的 为了记录下这个点被访问过 所以,给定它一个费用1 然后其他的连边和原来做的题目没有什么区别 对于每一条航线,从\(i'\)向\(j\)

网络流(费用流):[网络流24题] 餐巾

[网络流24题] 餐巾 [问题描述] 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,…,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f<p).如m=l时,第一天送到快洗部的餐巾第二天就可以使用了,送慢洗的情况也如此. (3)把餐巾送到慢洗部,洗一块需n天(n>m),费用需s分(s<f). 在每天结束时,餐厅必须决定多少块用过的餐巾送到快洗部,多少块送慢洗部.在每天开始时,餐厅必须决定是否购买新餐

【网络流24题】分配问题(二分图最佳匹配)(费用流)

[网络流24题]分配问题 2014年3月11日1,8720 题目描述 Description 有n件工作要分配给n个人做.第i 个人做第j 件工作产生的效益为ij c .试设计一个将n件工作分配给n个人做的分配方案,使产生的总效益最大.«编程任务:对于给定的n件工作和n个人,计算最优分配方案和最差分配方案. 输入描述 Input Description 第1 行有1 个正整数n,表示有n件工作要分配给n 个人做.接下来的n 行中,每行有n 个整数 cij ,1≤i≤n,1≤j≤n,表示第i 个人