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

【网络流24题】运输问题

2014年3月7日1,6360

题目描述 Description

W 公司有m个仓库和n 个零售商店。第i 个仓库有ai 个单位的货物;第j 个零售商店
需要bj个单位的货物。货物供需平衡,即  sum(si)=sum(bj)
。从第i 个仓库运送每单位货物到
第j 个零售商店的费用为cij 。试设计一个将仓库中所有货物运送到零售商店的运输方案,
使总运输费用最少。
编程任务:
对于给定的m 个仓库和n 个零售商店间运送货物的费用,计算最优运输方案和最差运输方案。

输入描述 Input Description

的第1行有2 个正整数m和n,分别表示仓库数和
零售商店数。接下来的一行中有m个正整数ai ,1≤i≤m,表示第i个仓库有ai 个单位的货
物。再接下来的一行中有n个正整数bj ,1≤j≤n,表示第j个零售商店需要bj 个单位的货
物。接下来的m行,每行有n个整数,表示从第i 个仓库运送每单位货物到第j个零售商店
的费用cij 。

输出描述 Output Description

将计算出的最少运输费用和最多运输费用输出

样例输入 Sample Input

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

样例输出 Sample Output

48500
69140

一道水题,网络流24题需要吐槽了,上下界的网络流没有

跑得挺快的。

很好构图,就是S向左边的点,连ai个单位,费用为0,右边向T连bi个单位,费用为0

然后左边向右边流量无限,费用c[i][j],即可,hh。

  1 #include<cstring>
  2 #include<cmath>
  3 #include<iostream>
  4 #include<algorithm>
  5 #include<cstdio>
  6 #include<queue>
  7
  8 #define N 2007
  9 #define M 1000007
 10 #define inf 1000000007
 11 using namespace std;
 12 inline int read()
 13 {
 14     int x=0,f=1;char ch=getchar();
 15     while(ch>‘9‘||ch<‘0‘){if (ch==‘-‘) f=-1;ch=getchar();}
 16     while(ch<=‘9‘&&ch>=‘0‘){x=(x<<3)+(x<<1)+ch-‘0‘;ch=getchar();}
 17     return x*f;
 18 }
 19
 20 int m,n,S,T;
 21 int cnt=1,head[N],next[M],rea[M],val[M],cost[M];
 22 int c[N][N],a[N],b[N];
 23 int dis[N],flag[N];
 24 struct Node
 25 {
 26     int e,fa;
 27     void init(){e=fa=-1;}
 28 }pre[N];
 29
 30 void add(int u,int v,int fee,int pay)
 31 {
 32     next[++cnt]=head[u];
 33     head[u]=cnt;
 34     rea[cnt]=v;
 35     val[cnt]=fee;
 36     cost[cnt]=pay;
 37 }
 38 void build(int k)
 39 {
 40     memset(head,-1,sizeof(head));cnt=1;
 41     for (int i=1;i<=m;i++)
 42     {
 43         int x=a[i];
 44         add(S,i,x,0),add(i,S,0,0);
 45     }
 46     for (int i=1;i<=n;i++)
 47     {
 48         int x=b[i];
 49         add(m+i,T,x,0),add(T,m+i,0,0);
 50     }
 51     for (int i=1;i<=m;i++)
 52         for (int j=1;j<=n;j++)
 53         {
 54             int x=c[i][j];
 55             add(i,m+j,inf,x*k),add(m+j,i,0,-x*k);
 56         }
 57 }
 58 bool Spfa()
 59 {
 60     for (int i=S;i<=T;i++)
 61         dis[i]=inf,flag[i]=0,pre[i].init();
 62     queue<int>q;q.push(S);
 63     dis[S]=0,flag[S]=1;
 64     while(!q.empty())
 65     {
 66         int u=q.front();q.pop();
 67         for (int i=head[u];i!=-1;i=next[i])
 68         {
 69             int v=rea[i],fee=cost[i];
 70             if ((dis[v]>dis[u]+fee)&&val[i]>0)
 71             {
 72                 dis[v]=dis[u]+fee;
 73                 pre[v].e=i,pre[v].fa=u;
 74                 if (!flag[v])
 75                 {
 76                     flag[v]=1;
 77                     q.push(v);
 78                 }
 79             }
 80         }
 81         flag[u]=0;
 82     }
 83     if (dis[T]==inf) return 0;
 84     else return 1;
 85 }
 86 int mfmc()
 87 {
 88     int flow=0,res=0;
 89     while(Spfa())
 90     {
 91         int x=inf;
 92         for (int i=T;pre[i].fa!=-1;i=pre[i].fa)
 93         {
 94             int e=pre[i].e;
 95             x=min(x,val[e]);
 96         }
 97         flow+=x,res+=dis[T]*x;
 98         for (int i=T;pre[i].fa!=-1;i=pre[i].fa)
 99         {
100             int e=pre[i].e;
101             val[e]-=x,val[e^1]+=x;
102         }
103     }
104     return res;
105 }
106 int main()
107 {
108     m=read(),n=read();S=0,T=n+m+1;
109     for (int i=1;i<=m;i++) a[i]=read();
110     for (int i=1;i<=n;i++) b[i]=read();
111     for (int i=1;i<=m;i++)
112         for (int j=1;j<=n;j++)
113             c[i][j]=read();
114     build(1);
115     printf("%d\n",mfmc());
116     build(-1);
117     printf("%d\n",-mfmc());
118 }
时间: 2024-10-06 18:57:46

【网络流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

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 个

【Codevs1237&amp;网络流24题餐巾计划】(费用流)

题意:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同. 假设第 i 天需要 ri块餐巾(i=1,2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分: 或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分: 或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s<f 分.每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗. 但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量.试设计一个算法为餐厅合理地安排好 N 天

BZOJ 1221 HNOI 2001 软件开发/网络流24题 餐巾计划问题 最小费用最大流

题目大意:有一个软件公司,每天需要给一些员工准备消毒毛巾,这些毛巾可以循环利用,但是需要消毒.可以将毛巾送去消毒,有两种方式,A天fA花费,B天fB花费.或者还可以直接买新毛巾,问为了满足员工的需求,至少需要花多少钱. 思路:经典的费用流问题.将每一天拆点,S向每一天<<1连边,约束每一天需要多少毛巾:每一天<<1|1向T连边,约束每一天需要的毛巾.每一天<<1向这一天清洗的毛巾能够使用的那一天<<1|1,注意A和B.毛巾可以延后使用,那么每一天<&l

网络流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??? . 试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少. 输入输出格式 输

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

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

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