[洛谷P4015]运输问题
题目大意:有m个仓库和n个商店。第i个仓库有 $a_{i}$ 货物,第j个商店需要$b_{j}$个货物。从第i个仓库运送每单位货物到第j个商店的费用为$c_{i,j}$。求出最小费用和最大费用
题解:费用流,最大费用的时候把价钱和答案都取反
卡点:1.数组开小
C++ Code:
#include<cstdio>
#include<cctype>
#include<cstring>
#define maxn 250
using namespace std;
const int inf=0x3f3f3f3f;
int n,m;
int mp[maxn][maxn],a[maxn],b[maxn];
int d[maxn],pre[maxn];
int q[maxn],h,t;
int st=1,ed;
int head[maxn],cnt=2;
bool vis[maxn];
struct Edge{
int to,nxt,w,cost;
}e[maxn*maxn<<1];
char ch;
void read(int &x){
ch=getchar();
while (!isdigit(ch))ch=getchar();
for (x=ch^48,ch=getchar();isdigit(ch);ch=getchar())x=x*10+(ch^48);
}
inline int min(int a,int b){return a<b?a:b;}
void add(int a,int b,int c,int d){
e[cnt]=(Edge){b,head[a],c,d};head[a]=cnt;
e[cnt^1]=(Edge){a,head[b],0,-d};head[b]=cnt^1;
cnt+=2;
}
void build(int op=1){
for (int i=1;i<=m;i++)add(st,i+1,a[i],0);
for (int i=1;i<=n;i++)add(m+i+1,ed,b[i],0);
for (int i=1;i<=m;i++){
for (int j=1;j<=n;j++)add(i+1,m+j+1,inf,mp[i][j]*op);
}
}
bool spfa(){
int x;
memset(d,0x3f,sizeof d);
d[q[h=t=1]=st]=0;
while (h<=t){
vis[x=q[h++]]=false;
for (int i=head[x];i;i=e[i].nxt){
int to=e[i].to;
if (e[i].w&&d[to]>d[x]+e[i].cost){
d[to]=d[x]+e[i].cost;
pre[to]=i;
if (!vis[to])vis[q[++t]=to]=true;
}
}
}
return d[ed]!=inf;
}
int update(){
int ans,mf=inf;
for (int i=pre[ed];i;i=pre[e[i^1].to])mf=min(mf,e[i].w);
ans=mf*d[ed];
for (int i=pre[ed];i;i=pre[e[i^1].to])e[i].w-=mf,e[i^1].w+=mf;
return ans;
}
void MCMF(int op=1){
int ans=0;
while (1){
int x;
memset(d,0x3f,sizeof d);
d[q[h=t=1]=st]=0;
while (h<=t){
vis[x=q[h++]]=false;
for (int i=head[x];i;i=e[i].nxt){
int to=e[i].to;
if (e[i].w&&d[to]>d[x]+e[i].cost){
d[to]=d[x]+e[i].cost;
pre[to]=i;
if (!vis[to])vis[q[++t]=to]=true;
}
}
}
if (d[ed]!=inf){
int mf=inf;
for (int i=pre[ed];i;i=pre[e[i^1].to])mf=min(mf,e[i].w);
ans+=mf*d[ed];
for (int i=pre[ed];i;i=pre[e[i^1].to])e[i].w-=mf,e[i^1].w+=mf;
}else break;
}
printf("%d\n",ans*op);
}
int main(){
read(m),read(n);
for (int i=1;i<=m;i++)read(a[i]);
for (int i=1;i<=n;i++)read(b[i]);
for (int i=1;i<=m;i++){
for (int j=1;j<=n;j++)read(mp[i][j]);
}
ed=n+m+2;
build();
MCMF();
memset(head,0,sizeof head);cnt=2;
build(-1);
MCMF(-1);
return 0;
}
[洛谷P4015]运输问题的更多相关文章
- 洛谷P4015 运输问题(费用流)
传送门 源点向仓库连费用$0$,流量为储量的边,商店向汇点连费用$0$,流量为需求的边,然后仓库向商店连流量$inf$,费用对应的边,跑个费用流即可 //minamoto #include<io ...
- 洛谷 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 运输问题(费用流)
题目描述 WW 公司有 mm 个仓库和 nn 个零售商店.第 ii 个仓库有 a_iai 个单位的货物:第 jj 个零售商店需要 b_jbj 个单位的货物. 货物供需平衡,即\sum\limits ...
- 洛谷P4015 运输问题 网络流24题
看了下SPFA题解,一个一个太麻烦了,另一个写的很不清楚,而且注释都变成了"????"不知道怎么过的,于是自己来一发SPFA算法. Part 1.题意 M 个仓库,卖给 N 个商店 ...
- 洛谷.4015.运输问题(SPFA费用流)
题目链接 嗯..水题 洛谷这网络流二十四题的难度评价真神奇.. #include <queue> #include <cstdio> #include <cctype&g ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
随机推荐
- STM32(4)——系统时钟和SysTick
1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HSE.LSI.LSE.PLL HSI是高速内部时钟,RC振荡器,频率为8MHz: HSE是高速外部时钟,可接石英/陶瓷谐振器 ...
- 阿里云mysql连接不上
轻量级服务器管理 - 防火墙 - 添加规则 防火墙 mysql 3306 注意IPtables 与 firewalld 状态! 啃爹的防火墙,找了一天
- (数据科学学习手札10)系统聚类实战(基于R)
上一篇我们较为系统地介绍了Python与R在系统聚类上的方法和不同,明白人都能看出来用R进行系统聚类比Python要方便不少,但是光介绍方法是没用的,要经过实战来强化学习的过程,本文就基于R对2016 ...
- Educational Codeforces Round 47 (Rated for Div. 2) :C. Annoying Present(等差求和)
题目链接:http://codeforces.com/contest/1009/problem/C 解题心得: 题意就是一个初始全为0长度为n的数列,m此操作,每次给你两个数x.d,你需要在数列中选一 ...
- python linecache读取过程
最近使用Python编写日志处理脚本时,对Python的几种读取文件的方式进行了实验.其中,linecache的行为引起了我的注意. Python按行读取文件的经典方式有以下几种: with open ...
- golang log
自带log模块 写入文件 package main import ( "fmt" "log" "os" ) func main(){ log ...
- java 日期格式 毫秒 表示方法
参考URL:http://www.busfly.net/csdn/post/java_string_fomat_date_time_simpledateformat.html 关键代码: java.t ...
- Java测试工具和框架
个人目前只接触过JUnit以及Powermock,后续会关注更多有关测试这方面的东西 8个超实用的Java测试工具和框架_开发/数据库_IT专家网 http://database.ctocio.com ...
- 给socks-proxy-agent增加认证
由于需要使用socks代理,查看了nodejs的各种socks库,最终的结论是socks库是其中最完善的,而socks-proxy-agent是以其为基础的封装,可以直接和http模块对接. 不过在尝 ...
- 做小Leader的心得体会
只是自己的工作心得体会,代码属于也不够专业,大家不喜勿喷. 8月份来到这家新公司,没过一个月给派了个活:带着两个小弟给某银行开发一个小工具.功能很简单,就是用Java做一个windows上的C端工具, ...