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. JavaScript学习笔记 isPrototypeOf和hasOwnProperty使用区别

    1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false. 格式如下: object ...

  2. 无线遥控器方案 Si4010/Si4012

    Si4010包含一个嵌入式兼容8051微控制器(MCU),内具4 kB的RAM.8 kB的一次性编程(OTP)非易失性内存.一个128位EEPROM以及用于函数库(library)功能的12 kB R ...

  3. ELM327 OBD to RS232 Interpreters

    http://elmelectronics.com/DSheets/ELM327DS.pdf

  4. fdopen()和fileno()函数

    转:http://book.2cto.com/201212/11763.html 文件描述字函数是流函数的初等函数,每一个流都与一个描述字相连.给定一个打开的文件描述字,可以用fdopen()函数为它 ...

  5. mysql知识点(三)

    1.表关联是可以利用两个表的索引的,如果是用子查询,至少第二次查询是没有办法使用索引的. 2.  为了给主查询提供数据而首先执行的查询被叫做子查询 3.如果WHERE子句的查询条件里使用了函数(WHE ...

  6. 权限项目总结(四) shiro 授权

    概述 Authorization(授权):不难理解,授权就是用来控制当前訪问用户在訪问系统资源权限. 这个词也做证书的解释,从证书这个角度来讲,推断是否拥有对资源訪问的权限时.当前用户须要提供证书. ...

  7. 用指令来构建IIS7

    工作上要部署iis7+net4.0环境,发现30多台机子都没有用装有IIS7镜像来安装,都必须自己手动. 作为程序猿,真要一台台装的话,就真对不起自己的职业.于是想到用bat来执行任务,找到了安装II ...

  8. 关于QtCharts中的映射器与模型的使用

    简述 本文章基于博主在使用QtCharts中一些经验总结,相关了Qt类有QVXYModelMapper,CustomTableModel(一个继承了QAbstractTableModel的类,用于实现 ...

  9. Scurm 术语

    角色 Product Owner Scrum Master Team 工件(Backlog) Product Backlog Sprint Backlog Burndown Backlog 活动 Sp ...

  10. [转载][概念]Storage Pool, Private RAID Group, Private LUN

    Storage Pool的起源 ========================== Some time ago, EMC introduced the concept of Virtual Prov ...