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. python3.5: error while loading shared libraries: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory

    python3.5安装报错 python3.5: error while loading shared libraries: libpython3.5m.so.1.0: cannot open sha ...

  2. Redmine 邮件配置

    高版本号的Redmine是没有email.yml的.是和configuration.yml合并了.仅仅要配置configuration.yml即可了. 首先得说下Redmine的邮件,配置这个邮件,是 ...

  3. LINQ中的动态排序

    使用Linq动态属性排序 使用反射: public static Func<T,Tkey> DynamicLambda<T, Tkey>(string propertyName ...

  4. 源码分析:动态分析 Linux 内核函数调用关系

    源码分析:动态分析 Linux 内核函数调用关系 时间 2015-04-22 23:56:07  泰晓科技 原文  http://www.tinylab.org/source-code-analysi ...

  5. Centos7 内核从3.10升级到4.12过程

    http://blog.csdn.net/youshijifen/article/details/73472434

  6. linux开发node相关的工具

    epel-release yum install epel-release node yum install nodejs mongodb 安装mongodb服务器端 yum install mong ...

  7. KindEditor编辑器常用操作

    创建编辑器: ar editor=KindEditor.create('#nr'); 设置编辑器内容: editor.html('编辑器内容'); 移除编辑器: editor.remove();

  8. OpenSSL再曝CCS注入漏洞-心伤未愈又成筛子

    太戏剧了,昨晚看了佳片有约,还不错,2012版的<完美回顾>,像我这样的人依旧选择用电视或者去影院看电影,在没有中间插播广告的时候,体验憋尿得过程中,总是能突然有非常多的想法,这是用电脑或 ...

  9. cocos2d-x_lua中tolua++绑定c++分享

    cocos2d-x_lua中tolua++绑定c++分享    我用的版本号是cocos2d-x 2.x的版本号   下面操作为了保证不更改引擎的一个类LuaCocos2d.cpp  1.操作前 能够 ...

  10. jquery的功能函数

    1.$.boxModel <!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.1 ...