\(\color{#0066ff}{题目描述}\)

W 公司有 m 个仓库和 n 个零售商店。第 i 个仓库有 \(a_i\) 个单位的货物;第 j 个零售商店需要 \(b_j\) 个单位的货物。

货物供需平衡,即\(\sum\limits_{i=1}^{m}a_i=\sum\limits_{j=1}^{n}b_j\)

从第 i 个仓库运送每单位货物到第 j 个零售商店的费用为 \(c_{ij}\)​ 。

试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少。

\(\color{#0066ff}{输入格式}\)

第 1 行有 2 个正整数 m 和 n,分别表示仓库数和零售商店数。

接下来的一行中有 m 个正整数 \(a_i\),表示第 i 个仓库有 \(a_i\) 个单位的货物。

再接下来的一行中有 n 个正整数 \(b_j\),表示第 j 个零售商店需要 \(b_j\) 个单位的货物。

接下来的 m 行,每行有 n 个整数,表示从第 i 个仓库运送每单位货物到第 j 个零售商店的费用 \(c_{ij}\) 。

\(\color{#0066ff}{输出格式}\)

两行分别输出最小运输费用和最大运输费用。

\(\color{#0066ff}{输入样例}\)

2 3
220 280
170 120 210
77 39 105
150 186 122

\(\color{#0066ff}{输出样例}\)

48500
69140

\(\color{#0066ff}{数据范围与提示}\)

1≤n,m≤100

\(\color{#0066ff}{题解}\)

S向每个仓库连容量为仓库货物量,边权为0的边(保证每个仓库的流出量)

仓库向商店连容量为仓库货物量,边权为运输费用的边

每个商店向T连容量为所需量,边权为0的边(保证所需)

建正边跑Dinic,在取相反数重新来

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#define _ 0
#define LL long long
inline LL in()
{
LL x=0,f=1; char ch;
while(!isdigit(ch=getchar()))(ch=='-')&&(f=-f);
while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
return x*f;
}
const LL inf=99999999999999999LL;
struct node{int to,nxt; LL dis,cap;}e[105050];
int cnt=1;
std::queue<int> q;
LL dis[555],change[555];
int n,m,s,t;
int head[555],road[555];
LL vala[555],valb[555];
bool vis[555];
LL val[555][555];
inline void add(int from,int to,LL cap,LL dis)
{
cnt++;
e[cnt].to=to;
e[cnt].dis=dis;
e[cnt].cap=cap;
e[cnt].nxt=head[from];
head[from]=cnt;
}
inline bool spfa()
{
for(int i=s;i<=t;i++) dis[i]=inf,change[i]=inf,vis[i]=0;
dis[s]=0;
q.push(s);
while(!q.empty())
{
int tp=q.front(); q.pop();
vis[tp]=false;
for(int i=head[tp];i;i=e[i].nxt)
{
int go=e[i].to;
if(dis[go]>dis[tp]+e[i].dis&&e[i].cap>0)
{
dis[go]=dis[tp]+e[i].dis;
road[go]=i;
change[go]=std::min(change[tp],e[i].cap);
if(!vis[go])
{
vis[go]=true;
q.push(go);
}
}
}
}
return change[t]!=inf;
}
inline void mcmf(int flag)
{
LL flow=0,cost=0;
while(spfa())
{
flow+=change[t];
cost+=change[t]*dis[t];
for(int o=t;o!=s;o=e[road[o]^1].to)
{
e[road[o]].cap-=change[t];
e[road[o]^1].cap+=change[t];
}
}
printf("%lld\n",cost*flag);
}
int main()
{
m=in(),n=in();
t=n+m+1,s=0;
for(int i=1;i<=m;i++) add(s,i,vala[i]=in(),0),add(i,s,0,0);
for(int i=1;i<=n;i++) add(i+m,t,valb[i]=in(),0),add(t,i+m,0,0);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
val[i][j]=in();
add(i,j+m,vala[i],val[i][j]);
add(j+m,i,0,-val[i][j]);
}
mcmf(1);
cnt=1;
for(int i=s;i<=t;i++) head[i]=0;
for(int i=1;i<=m;i++) add(s,i,vala[i],0),add(i,s,0,0);
for(int i=1;i<=n;i++) add(i+m,t,valb[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,vala[i],-val[i][j]);
add(j+m,i,0,val[i][j]);
}
mcmf(-1);
return 0;
}

P4015 运输问题的更多相关文章

  1. P4015 运输问题 最大/最小费用最大流

    P4015 运输问题 #include <bits/stdc++.h> using namespace std; , inf = 0x3f3f3f3f; struct Edge { int ...

  2. P4015 运输问题 网络流问题

    题目描述 WW 公司有 mm 个仓库和 nn 个零售商店.第 ii 个仓库有 a_iai​ 个单位的货物:第 jj 个零售商店需要 b_jbj​ 个单位的货物. 货物供需平衡,即\sum\limits ...

  3. Luogu P4015 运输问题

    题目链接 \(Click\) \(Here\) 继续颓网络流\(hhhhh\),虽然这次写的是个大水题,但是早上水一个网络流果然还是让人心情舒畅啊- 最大费用最大流不用非得反着费用建边.只要没有正环, ...

  4. 洛谷P4015 运输问题(费用流)

    传送门 源点向仓库连费用$0$,流量为储量的边,商店向汇点连费用$0$,流量为需求的边,然后仓库向商店连流量$inf$,费用对应的边,跑个费用流即可 //minamoto #include<io ...

  5. [洛谷P4015]运输问题

    题目大意:有m个仓库和n个商店.第i个仓库有 $a_{i}$ 货物,第j个商店需要$b_{j}$个货物.从第i个仓库运送每单位货物到第j个商店的费用为$c_{i,j}$​​.求出最小费用和最大费用 题 ...

  6. 洛谷 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]).建两次图分别跑最小费用最大流和最大费用最大流即可 ...

  7. 洛谷P4015 运输问题(费用流)

    题目描述 WW 公司有 mm 个仓库和 nn 个零售商店.第 ii 个仓库有 a_iai​ 个单位的货物:第 jj 个零售商店需要 b_jbj​ 个单位的货物. 货物供需平衡,即\sum\limits ...

  8. 洛谷P4015 运输问题 网络流24题

    看了下SPFA题解,一个一个太麻烦了,另一个写的很不清楚,而且注释都变成了"????"不知道怎么过的,于是自己来一发SPFA算法. Part 1.题意 M 个仓库,卖给 N 个商店 ...

  9. P4015 运输问题【zkw费用流】

    输入输出样例 输入 #1复制 2 3 220 280 170 120 210 77 39 105 150 186 122 输出 #1复制 48500 69140zuixiaofeiyo 说明/提示 1 ...

随机推荐

  1. 数据库:sql 多表联合更新【转】

    SQL Update多表联合更新的方法 (1) sqlite 多表更新方法 update t1 set col1=t2.col1 from table1 t1 inner join table2 t2 ...

  2. iphone配置实用工具iPhone Configuration Utility

    下载地址 http://support.apple.com/kb/DL1466 安装完毕后,在设备->控制台,可以很方便看到报错信息

  3. spring与struts有什么区别?

    Struts只是一个MVC框架(Framework),用于快速开发Java Web应用.Struts实现的重点在C(Controller),包括ActionServlet/RequestProcess ...

  4. No result defined for action action.LoginAction and result success 问题解决

    转自:https://blog.csdn.net/dongzhout/article/details/43699699 搭建好SSH2框架,写一个简单的登陆功能,提交表单的时候遇到这个问题: 配置文件 ...

  5. jquery-messager-消息提示

    一.页面引入 jquery.js 下载地址问度娘 jquery-message.js 下载地址:jquery-message.js 二.页面使用 //ajax轮询检查新的订单 function che ...

  6. 《Android应用性能优化》 第5章 多线程和同步

    1.DDMS中可以看见的系统线程(Andorid3.1的Galaxy Tab 10.1为例): main HeapWorker 执行finalize函数和引用对象清理 GC Garbage Colle ...

  7. cocos2d-js 定时器

    1.scheduleUpdate 节点中有scheduleUpdate接口,通过这个接口,可以让游戏在每帧执行都执行update方法 var ScheduleUpdateLayer = cc.Laye ...

  8. ROS Learning-018 Arduino-For-ROS-003 (总结篇) 模板程序 即 如何运行

    Arduino For ROS-003 - (总结篇) 模板程序 即 如何运行 我的Ubuntu系统:Ubuntu 14.04.10 TLS 32位 Arduino的版本:Arduino 1.6.11 ...

  9. bzoj2134 错选单位

    传送门 题目 Input n很大,为了避免读入耗时太多, 输入文件只有5个整数参数n, A, B, C, a1, 由上交的程序产生数列a. 下面给出pascal/C/C++的读入语句和产生序列的语句( ...

  10. vue 之 计算属性和侦听器

    计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split('').rever ...