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 186 122

tran.out

48500
69140

对于全部数据:1<=N,M<=100

题解:

比較easy想到费用流。

建图:

1>建立虚拟源S和汇T。

2>从S到m个仓库建流量为a[i],费用为0的边。

3>从n个商店向T建流量为b[i],费用为0的边。

4>从m个仓库向n个商店建流量为无穷大。费用为c[i][j]的边。

然后跑一边最小费用。再跑一边最大费用就好了。

Code:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 310
#define M 30010
#define inf 0x7ffffff
using namespace std;
struct Edge{
int v,next,cap,cost;
}edge[M];
int n,m,num,ans,S,T,a[N],b[N],c[N][N];
int head[N],flow[N],prep[N],prev[N],dis[N],q[M];
bool vis[N];
int in(){
int x=0; char ch=getchar();
while (ch<'0' || ch>'9') ch=getchar();
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
void add(int u,int v,int cap,int cost){
edge[++num].v=v; edge[num].next=head[u]; head[u]=num;
edge[num].cap=cap; edge[num].cost=cost;
}
void build(){
S=0,T=m+n+1;
for (int i=1; i<=m; i++)
add(S,i,a[i],0),add(i,S,0,0);
for (int i=1; i<=n; i++)
add(i+m,T,b[i],0),add(T,i+m,0,0);
for (int i=1; i<=m; i++)
for (int j=1; j<=n; j++)
add(i,j+m,inf,c[i][j]),add(j+m,i,0,-c[i][j]);
}
bool spfa(int k){
int h=0,t=1;
if (k>0) memset(dis,0x3f,sizeof(dis));
else memset(dis,128,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[S]=0; q[h]=S; vis[S]=1;
flow[S]=inf; prep[S]=-1;
while (h<t){
int u=q[h++]; vis[u]=0;
for (int i=head[u]; i; i=edge[i].next){
int v=edge[i].v;
if (edge[i].cap>0 && ((k>0 && dis[v]>dis[u]+edge[i].cost) || (k<0 && dis[v]<dis[u]+edge[i].cost))){
dis[v]=dis[u]+edge[i].cost;
prep[v]=u; prev[v]=i;
flow[v]=min(flow[u],edge[i].cap);
if (!vis[v]) vis[v]=1,q[t++]=v;
}
}
}
if (k>0){
if (dis[T]>inf) return 0;
else return 1;
}
else {
if (dis[T]<0) return 0;
else return 1;
}
}
void work(){
for (int i=T; i!=S; i=prep[i]){
edge[prev[i]].cap-=flow[T];
edge[prev[i]^1].cap+=flow[T];
}
ans+=flow[T]*dis[T];
}
int main(){
m=in(),n=in();
for (int i=1; i<=m; i++) a[i]=in();
for (int i=1; i<=n; i++) b[i]=in();
for (int i=1; i<=m; i++)
for (int j=1; j<=n; j++) c[i][j]=in();
num=1; build(); ans=0;
while (spfa(1)) work();
printf("%d\n",ans);
memset(head,0,sizeof(head));
memset(prep,0,sizeof(prep));
memset(prev,0,sizeof(prev));
memset(flow,0,sizeof(flow));
num=1; build(); ans=0;
while (spfa(-1)) work();
printf("%d\n",ans);
return 0;
}

【费用流】【网络流24题】【cogs 739】运输问题的更多相关文章

  1. LG2770/LOJ6122 航空路线问题 费用流 网络流24题

    问题描述 LG2770 LOG6122 题解 教训:关掉流同步之后就不要用其他输入输出方式了. 拆点. 两个拆点之间连\((1,1)\),其他连\((1,0)\) \(\mathrm{Code}\) ...

  2. cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)

    描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...

  3. [网络流24题] COGS 搭配飞行员

    14. [网络流24题] 搭配飞行员 ★★☆   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     飞行大队 ...

  4. [网络流24题] COGS 运输问题1

    11. 运输问题1 ★★☆   输入文件:maxflowa.in   输出文件:maxflowa.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     一个工厂每天生 ...

  5. [网络流24题] COGS 750 栅格网络流

    750. 栅格网络流 ★★☆   输入文件:flowa.in   输出文件:flowa.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] Bob 觉得一般图的最大流问题太 ...

  6. LG2766 最长不下降子序列问题 最大流 网络流24题

    问题描述 LG2766 题解 \(\mathrm{Subtask 1}\) 一个求最长不下降子序列的问题,发现\(n \le 500\),直接\(O(n^2)\)暴力DP即可. \(\mathrm{S ...

  7. Cogs 739. [网络流24题] 运输问题(费用流)

    [网络流24题] 运输问题 ★★ 输入文件:tran.in 输出文件:tran.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: «编程任务: 对于给定的m 个仓库和n 个零售 ...

  8. Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)

    Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...

  9. LIbreOJ #6011. 「网络流 24 题」运输问题 最小费用最大流

    #6011. 「网络流 24 题」运输问题 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

随机推荐

  1. python开发_glob

    ''' 在python中,glob模块是用来查找匹配的文件的 在查找的条件中,需要用到Unix shell中的匹配规则: * : 匹配所所有 ? : 匹配一个字符 *.* : 匹配如:[hello.t ...

  2. 【原创】Eclipse导入Android项目报错解决

    1.点击报错的项目--->右键--->Properties--->选择Android--->将Project Build Target选择其一勾上-->Is Librar ...

  3. python相对包导入报“Attempted relative import in non-package”错误

    文章是从stackoverflow翻译过来的,原文地址:Relative imports for the billionth time 本文要在原理上解决  python当中相对包导入出现的问题. 问 ...

  4. CAShapeLayer实现音量大小动态改变

    我是效果图 实现如图这效果一般会直接通过多张图进行切换进行完成.但这样的处理,会浪费App的资源存储空间,而且效率也不高.那么今天我们用CAShapeLayer实现以下吧. 拆分: 1.一个椭圆 2. ...

  5. Backbone.js 的最佳应用场景有哪些?#zhihu#

    这段时间,想再次了解下backbone js的相关知识,就把一些认为不错的拿过来了: 新版的有道笔记 Web 版(http://note.youdao.com)也使用了 Backbone.就像其他答案 ...

  6. Ruby入门(1)——windows下Ruby开发环境搭建

    1.获得和安装Ruby1.1 获取Ruby    1) 从 http://www.ruby-lang.org/en/downloads/ 下载Source Code或者RubyInstaller    ...

  7. STN1170 Multiprotocol OBD to UART Interpreter

    http://www.obdsol.com/stn1170/ STN1170 supports the following protocols: all legislated OBD II proto ...

  8. 有用的iOS网站地址

    王巍 (@onevcat) 是一名 iOS 和 Unity3D 开发者,现旅居日本,正在寻求创意之源.http://swifter.tips/http://onevcat.com/2013/02/xc ...

  9. Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文实现了一个后台由Spring+Mybatis+SpringMVC组成,分页采用Pag ...

  10. nose的测试报告

    有时候我们要让报告整洁美观点,以html展示测试结果,我们可以借助pip install nosehtmloutput插件输出html格式报告 from nose.plugins.plugintest ...