【费用流】【网络流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 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】运输问题的更多相关文章
- LG2770/LOJ6122 航空路线问题 费用流 网络流24题
问题描述 LG2770 LOG6122 题解 教训:关掉流同步之后就不要用其他输入输出方式了. 拆点. 两个拆点之间连\((1,1)\),其他连\((1,0)\) \(\mathrm{Code}\) ...
- cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)
描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...
- [网络流24题] COGS 搭配飞行员
14. [网络流24题] 搭配飞行员 ★★☆ 输入文件:flyer.in 输出文件:flyer.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队 ...
- [网络流24题] COGS 运输问题1
11. 运输问题1 ★★☆ 输入文件:maxflowa.in 输出文件:maxflowa.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 一个工厂每天生 ...
- [网络流24题] COGS 750 栅格网络流
750. 栅格网络流 ★★☆ 输入文件:flowa.in 输出文件:flowa.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] Bob 觉得一般图的最大流问题太 ...
- LG2766 最长不下降子序列问题 最大流 网络流24题
问题描述 LG2766 题解 \(\mathrm{Subtask 1}\) 一个求最长不下降子序列的问题,发现\(n \le 500\),直接\(O(n^2)\)暴力DP即可. \(\mathrm{S ...
- Cogs 739. [网络流24题] 运输问题(费用流)
[网络流24题] 运输问题 ★★ 输入文件:tran.in 输出文件:tran.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: «编程任务: 对于给定的m 个仓库和n 个零售 ...
- Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)
Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...
- LIbreOJ #6011. 「网络流 24 题」运输问题 最小费用最大流
#6011. 「网络流 24 题」运输问题 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
随机推荐
- js 运算符 || && 妙用
首先出个题:如图: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭头: 成长速度为12显示3个箭头: 成长速度为15显示4个箭头: 其他都显示都显示0个箭 ...
- CDOJ 1292 卿学姐种花 暴力 分块 线段树
卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...
- 用python slearning类库实现数据挖掘(python3.x)
Summary of test0 data : source data source code : in test0 file reference : - Reference Website / - ...
- Shell基础学习(三) 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 以下实例我们向脚本传递三个参数 ...
- HDU 4498 Function Curve (分段,算曲线积分)
Function Curve Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)To ...
- iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer
工具介绍 1. bundler bundler用于管理ruby gem的工具,我们用来管理cocoapods以及fastlane的版本.直接sudo gem install bundler就可以.然后 ...
- API & HTTP 请求调试:Postman
参考: Postman 是一个非常棒的Chrome扩展,提供功能强大的API & HTTP 请求调试. 它能够发送任何类型的HTTP requests (GET, HEAD, POST, PU ...
- 【spring cloud】分布式ID,雪花算法
分布式ID生成服务 参考地址:https://blog.csdn.net/wangkang80/article/details/77914849 算法描述: 最高位是符号位,始终为0,不可用. 41位 ...
- CSRF攻击演示
CSRF就是伪装成用户做坏事! 它的手段可能是: 一张引发邪恶请求的图片: <img src="http://localhost/demoA.php?money=500" / ...
- .NET:C#的匿名委托 和 Java的匿名局部内部类
背景 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一个假设:Java的字节码只支持静态嵌套类,内部类.局部内部类和匿名局部内部类都是编译 ...