网络流24题 -No.17 运输问题

问题描述
W公司有m个仓库和n个零售商店。第i个仓库有ai个单位的货物;第j个零售商店需要bj个单位的货物。货物供需平衡。从第i个仓库运送每单位货物到第j个零售商店的费用为c[i,j]。试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少。

编程任务
对于给定的 m 个仓库和 n 个零售商店间运送货物的费用,计算最优运输方案和最差运输方案。

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

结果输出
程序运行结束时,输出计算出的最少运输费用和最多运输费用。

输入文件示例

input.txt

2 3

220 280

170 120 210

77 39 105

150 186 122

输出文件示例

output.txt

48500 69140

把所有仓库看做二分图中顶点Xi,所有零售商店看做二分图中顶点Yi,建立附加源S汇T。
1、从S向每个Xi连一条容量为仓库中货物数量ai,费用为0的有向边。
2、从每个Yi向T连一条容量为商店所需货物数量bi,费用为0的有向边。
3、从每个Xi向每个Yj连接一条容量为无穷大,费用为cij的有向边。

这道题其实就是求一个网络中的最小费用最大流和最大费用最大流,最小费用最大流略过,最大费用最大流有2中方法:

1、把所有费用变成相反数做一遍最小费用最大流,输出答案的相反数;

2、初始化spfa时dis数组全从max改为-1,松弛的条件从 dis[i]>dis[j]+cap[i,j]改为dis[i]<dis[j]+cap[i,j];

此处我采用了第一种方法。

代码:

 1 const
 2   maxn=100000000;
 3
 4 var
 5   ot,ot1,ne1,cap1,ne,cap,h:array[0..30000]of longint;
 6   cost,cost1:array[0..30000,1..2]of longint;
 7   g,g1,pre,dis:array[0..1010]of longint;
 8   inq:array[0..1010]of boolean;
 9   e,s,t,c,i,n,m,ans,j:longint;
10
11 procedure addedge(x,y,z,w:longint);
12 begin
13   ot[e]:=y; ne[e]:=g[x]; cap[e]:=z; cost[e,1]:=w; cost[e,2]:=-w; g[x]:=e; inc(e);
14   ot[e]:=x; ne[e]:=g[y]; cap[e]:=0; cost[e,1]:=-w; cost[e,2]:=w; g[y]:=e; inc(e);
15 end;
16
17 function min(a,b:longint):longint;
18 begin
19   if a<b then exit(a) else exit(b);
20 end;
21
22 function spfa(c:longint):boolean;
23 var
24   x,y,l,r,p:longint;
25 begin
26   for i:=s to t do
27     begin dis[i]:=maxn; inq[i]:=false; end;
28   l:=0; r:=1; dis[s]:=0; inq[s]:=true; h[1]:=s; pre[s]:=-1;
29   while l<r do
30     begin
31       inc(l);
32       x:=h[l];
33       p:=g[x];
34       while p>-1 do
35         begin
36           y:=ot[p];
37           if (cap[p]>0)and(dis[y]>dis[x]+cost[p,c])
38             then begin
39                    dis[y]:=dis[x]+cost[p,c]; pre[y]:=p;
40                    if inq[y]=false
41                      then begin inq[y]:=true; inc(r); h[r]:=y; end;
42                  end;
43           p:=ne[p];
44         end;
45       inq[x]:=false;
46     end;
47   exit(dis[t]<>maxn);
48 end;
49
50 function find_path(c:longint):longint;
51 var
52   x,p,tmp,path:longint;
53 begin
54   x:=t; path:=maxn; tmp:=0;
55   while x>s do
56     begin
57       p:=pre[x];
58       path:=min(path,cap[p]);
59       x:=ot[p xor 1];
60     end;
61   x:=t;
62   while x>s do
63     begin
64       p:=pre[x];
65       inc(tmp,path*cost[p,c]);
66       inc(cap[p xor 1],path);
67       dec(cap[p],path);
68       x:=ot[p xor 1];
69     end;
70   exit(tmp);
71 end;
72
73 begin
74   e:=0;
75   fillchar(g,sizeof(g),255);
76   readln(n,m);
77   s:=0; t:=n+m+1; ans:=0;
78   for i:=1 to n do
79     begin read(c); addedge(s,i,c,0); end;
80   for i:=1 to m do
81     begin read(c); addedge(n+i,t,c,0); end;
82   for i:=1 to n do
83     for j:=1 to m do
84       begin
85         read(c);
86         addedge(i,n+j,maxn,c);
87       end;
88   g1:=g; ot1:=ot; cap1:=cap; ne1:=ne; cost1:=cost;
89   while spfa(1) do
90     inc(ans,find_path(1));
91   writeln(ans);
92   ans:=0;
93   g:=g1; ot:=ot1; cap:=cap1; ne:=ne1; cost:=cost1;
94   while spfa(2) do
95     inc(ans,find_path(2));
96   writeln(-ans);
97 end.
时间: 2024-08-15 23:27:50

网络流24题 -No.17 运输问题的相关文章

网络流24题 -No.18 分配问题

问题描述 有 n件工作要分配给 n个人做.第 i 个人做第 j 件工作产生的效益为c[i,j] .试设计一个将n 件工作分配给 n个人做的分配方案,使产生的总效益最大. 编程任务对于给定的 n件工作和 n 个人,计算最优分配方案和最差分配方案. 数据输入输入的第 1 行有 1 个正整数 n,表示有 n件工作要分配给 n 个人做.接下来的 n 行中,每行有 n 个整数c[i,j],1≤i≤n,1≤j≤n,表示第 i 个人做第 j 件工作产生的效益为c[i,j] . 结果输出程序运行结束时,输出最小

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

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题】【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题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分图最小路径覆盖 <3> 4 魔术球问题 <4> 5 圆桌问题 <5> 6 最长递增子序列问题 <6> 7 试题库问题 <7> 8 机器人路径规划问题 <8> 9 方格取数问题 二分图最大点权独立集 <9> 10 餐巾计划问题

【网络流24题----14】孤岛营救问题

孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形,其南北方向被划分为 N行,东西方向被划分为 M列,于是整个迷宫被划分为 N×M个单元.每个单元的位置可用一个有序数对 (单元的行号,单元的列号)来表示.南北或东西方向相邻的 2个单元之间可能互

【网络流24题】魔术球问题

P1226 - [网络流24题]魔术球问题 Description 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可 放11个球. ′编程任务: 对于给定的n,计算在 n根柱子上最多能放多少个球. Input 第1 行有 1个正整数n,表示柱子数. Output 第一行是球

【网络流24题】 No.12 软件补丁问题(最小转移代价 最短路)

[题意] T 公司发现其研制的一个软件中有 n 个错误, 随即为该软件发放了一批共 m 个补丁程序. 每一个补丁程序都有其特定的适用环境, 某个补丁只有在软件中包含某些错误而同时又不包含另一些错误时才可以使用.一个补丁在排除某些错误的同时, 往往会加入另一些错误.换句话说, 对于每一个补丁 i, 都有 2 个与之相应的错误集合 B1[i]和 B2[i],使得仅当软件包含 B1[i]中的所有错误, 而不包含 B2[i]中的任何错误时, 才可以使用补丁 i. 补丁 i 将修复软件中的某些错误 F1[

BZOJ_1221_ [HNOI2001]_软件开发(网络流24题,最小费用流)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1221 n天,每天需要r个毛巾,用完以后可以洗,要么花fa洗a天,要么花fb洗b天,毛巾不够了可以话f买一个,问最少需要多少钱. 分析 把每天拆成两个点:x[i]表示第i天的脏毛巾,y[i]表示第i天要用的毛巾. 1.s向x[i]连弧,容量为r[i],花费为0,表示每天会用脏r[i]条毛巾. 2.x[i]向x[i+1]连弧(注意边界),容量为INF,花费为0,表示把第i天的脏毛巾搁置到第i+1