洛谷P4015 运输问题(费用流)
题目描述
WW 公司有 mm 个仓库和 nn 个零售商店。第 ii 个仓库有 a_iai 个单位的货物;第 jj 个零售商店需要 b_jbj 个单位的货物。
货物供需平衡,即\sum\limits_{i=1}^{m}a_i=\sum\limits_{j=1}^{n}b_ji=1∑mai=j=1∑nbj 。
从第 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 。
输出格式:
两行分别输出最小运输费用和最大运输费用。
输入输出样例
说明
1 \leq n, m \leq 1001≤n,m≤100
挺裸的一道费用流
从S向仓库连容量为a,费用为0的边
从商店向T连容量为b,费用为0的边
从仓库向商店连容量为INF,费用为c的边
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define AddEdge(x,y,z,f) add_edge(x,y,z,f),add_edge(y,x,-z,0)
using namespace std;
const int INF=1e8+;
const int MAXN=1e4+;
inline int read()
{
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int N,M,S,T;
int ansflow,anscost;
int A[MAXN],B[MAXN],C[][];
struct node
{
int u,v,w,f,nxt;
}edge[MAXN];
int head[MAXN],num=;
inline void add_edge(int x,int y,int z,int f)
{
edge[num].u=x;
edge[num].v=y;
edge[num].w=z;
edge[num].f=f;
edge[num].nxt=head[x];
head[x]=num++;
}
int dis[MAXN],vis[MAXN],Pre[MAXN];
int SPFA()
{
queue<int>q;
q.push(S);
memset(dis,0x3f,sizeof(dis));
memset(vis,,sizeof(vis));
dis[S]=;
while(q.size()!=)
{
int p=q.front();q.pop();
vis[p]=;
for(int i=head[p];i!=-;i=edge[i].nxt)
{
if(edge[i].f>&&dis[edge[i].v]>dis[p]+edge[i].w)
{
dis[edge[i].v]=dis[p]+edge[i].w;
Pre[edge[i].v]=i;
if(!vis[edge[i].v])
q.push(edge[i].v),vis[edge[i].v]=;
}
}
}
return dis[T]<=INF;
}
int F()
{
int nowflow=INF;
for(int now=T;now!=S;now=edge[Pre[now]].u)
nowflow=min(nowflow,edge[Pre[now]].f);
for(int now=T;now!=S;now=edge[Pre[now]].u)
edge[Pre[now]].f-=nowflow,
edge[Pre[now]^].f+=nowflow;
anscost+=nowflow*dis[T];
}
void MCMF()
{
while(SPFA()) F();
printf("%d\n",abs(anscost));
anscost=;
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#endif
memset(head,-,sizeof(head));
N=read(),M=read();
S=N+M+;T=N+M+;
for(int i=;i<=N;i++)
A[i]=read();
for(int i=;i<=M;i++)
B[i]=read();
for(int i=;i<=N;i++)
for(int j=;j<=M;j++)
C[i][j]=read(); for(int i=;i<=N;i++)
AddEdge(S,i,,A[i]); for(int i=;i<=M;i++)
AddEdge(i+N,T,,B[i]);
for(int i=;i<=N;i++)
for(int j=;j<=M;j++)
AddEdge(i,j+N,C[i][j],INF);
MCMF();
memset(head,-,sizeof(head));
num=;
for(int i=;i<=N;i++)
AddEdge(S,i,,A[i]);
for(int i=;i<=M;i++)
AddEdge(i+N,T,,B[i]);
for(int i=;i<=N;i++)
for(int j=;j<=M;j++)
AddEdge(i,j+N,-C[i][j],INF);
MCMF();
return ;
}
洛谷P4015 运输问题(费用流)的更多相关文章
- 洛谷P4015 运输问题(费用流)
		
传送门 源点向仓库连费用$0$,流量为储量的边,商店向汇点连费用$0$,流量为需求的边,然后仓库向商店连流量$inf$,费用对应的边,跑个费用流即可 //minamoto #include<io ...
 - [洛谷P4015]运输问题
		
题目大意:有m个仓库和n个商店.第i个仓库有 $a_{i}$ 货物,第j个商店需要$b_{j}$个货物.从第i个仓库运送每单位货物到第j个商店的费用为$c_{i,j}$.求出最小费用和最大费用 题 ...
 - 洛谷P4014 分配问题(费用流)
		
题目描述 有 nn 件工作要分配给 nn 个人做.第 ii 个人做第 jj 件工作产生的效益为 c_{ij}cij .试设计一个将 nn 件工作分配给 nn 个人做的分配方案,使产生的总效益最大. ...
 - 洛谷 P4015 运输问题 【最小费用最大流+最大费用最大流】
		
s向仓库i连ins(s,i,a[i],0),商店向t连ins(i+m,t,b[i],0),商店和仓库之间连ins(i,j+m,inf,c[i][j]).建两次图分别跑最小费用最大流和最大费用最大流即可 ...
 - 洛谷P4015 运输问题 网络流24题
		
看了下SPFA题解,一个一个太麻烦了,另一个写的很不清楚,而且注释都变成了"????"不知道怎么过的,于是自己来一发SPFA算法. Part 1.题意 M 个仓库,卖给 N 个商店 ...
 - 洛谷  P3128 [USACO15DEC]最大流Max Flow-树上差分(点权/点覆盖)(模板题)
		
因为徐州现场赛的G是树上差分+组合数学,但是比赛的时候没有写出来(自闭),背锅. 会差分数组但是不会树上差分,然后就学了一下. 看了一些东西之后,对树上差分写一点个人的理解: 首先要知道在树上,两点之 ...
 - 洛谷.4015.运输问题(SPFA费用流)
		
题目链接 嗯..水题 洛谷这网络流二十四题的难度评价真神奇.. #include <queue> #include <cstdio> #include <cctype&g ...
 - 洛谷P3381 最小费用最大流
		
费用流板子 还是一道板子题..先练练手 #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset( ...
 - 洛谷 P3410 拍照(最大流 + 建图)
		
这道题问的是一群人要和另一群人合影,每个客人都有必须在场的人全部在场才能在场,每个客人给的有收入,但是邀请也需要支出,问最大收入? 我觉得可以总结为一类问题,就是有先决条件的网络流问题.看到费用和支出 ...
 
随机推荐
- 多态&接口
			
多态 多态定义:允许一个父类变量引用子类的对象:允许一个接口类型引用实现类对象. 多态的调用:使用父类的变量指向子类的对象:所调用的属性和方法只限定父类中定义的属性和方法,不能调用子类中特有的属性和方 ...
 - Python:Matplotlib 画曲线和柱状图(Code)
			
原文链接:http://blog.csdn.net/ikerpeng/article/details/20523679 参考资料:http://matplotlib.org/gallery.html ...
 - 如何用npm安装vue
			
下载安装node.js,安装完毕做好配置后开始运行. 如果npm版本太低,需要升级一下npm # 查看版本 $ npm -v #升级 npm cnpm install npm -g 安装vue-cli ...
 - Python代码块缓存、小数据池
			
引子 前几天遇到了这样一道Python题目:a='123',b='123',下列哪个是正确的? A. a != b B. a is b C. a==123 D. a + b =246 正确答案是B 是 ...
 - Linux常用命令速查
			
索引表格 命令 功能简述 目录与文件基本操作 pwd 显示当前目录 ls 列出目录和文件名称 cp 复制文件或目录 mv 移动或更名现有的文件或目录 rm 删除文件或目录 mkdir 新建目录 rmd ...
 - jQuery节点操作方法大全
			
1.append() 向每个匹配的元素内部追加内容 HTML代码: <p>我想说:</p> jQuery代码: $('p').append('<b>你好</b ...
 - OPENGL学习【一】VS2008开发OPENGL程序开发环境搭建
			
1.VS2008工具自行在网上下载安装,现只提供VS2008开发工具中配置OPENGL环境的详细步骤.开发包及编译工具会在下方一并放出链接. 2.打开CMake的工具,主要的配置信息如下,按照数字顺序 ...
 - Springboot分布式锁实践(redis)
			
springboot2本地锁实践一文中提到用Guava Cache实现锁机制,但在集群中就行不通了,所以我们还一般要借助类似Redis.ZooKeeper 之类的中间件实现分布式锁,下面我们将利用自定 ...
 - static类型autowired 注入失败
			
原代码:注入commonService对象失败 @Autowired private static CommonService commonService; public static List< ...
 - PL/SQL控制语句
			
本节要点: l 选择结构控制语句 if条件控制语句 Case语句 l 循环结构控制语句 基本loop循环 for循环 while循环 嵌套循环 PL/SQL既然是面向过程的编程语言,那么它就有针对 ...