Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)
Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)
Description
W 公司有m个仓库和n个零售商店。第i个仓库有\(a_i\)个单位的货物;第j个零售商店需要\(b_j\)个单位的货物。货物供需平衡。从第i个仓库运送每单位货物到第j个零售商店的费用为\(c_{ij}\)。试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少。
Input
第1行有2个正整数m和n,分别表示仓库数和零售商店数。接下来的一行中有m个正整数\(a_i\),表示第i个仓库\(a_i\)个单位的货物。再接下来的一行中有n个正整数\(b_j\),表示第j个零售商店需要\(b_j\)个单位的货物。接下来的m行,每行有n个整数,表示从第i个仓库运送每单位货物到第j个零售商店的费用\(c_{ij}\)。
Output
两行分别输出最小运输费用和最大运输费用。
Sample Input
2 3
220 280
170 120 210
77 39 105
150 186 122
Sample Output
48500
69140
Http
Libre:https://loj.ac/problem/6011
Source
网络流,最小费用最大流
解决思路
这道题的网络流思想还是比较明显的。
对于每一个仓库,从源点连一条容量为该仓库的库存、费用为0的边,对于每一个\(c_{ij}\),连一条仓库i到商店j的边满足容量为无穷大费用为\(c_{ij}\)。再从每一个商店到汇点连一条容量为商店的需求费用为0的边。
然后分别跑最小费用最大流和最大费用最大流即可。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int maxN=301;
const int maxM=maxN*maxN*4;
const int inf=2147483647;
class Edge
{
public:
int u,v,cost,flow;
};
int n,m;
int cnt=-1;
int A[maxN];
int B[maxN];
int Map[maxN][maxN];
int Head[maxN];
int Next[maxM];
Edge E[maxM];
int Dist[maxN];
int Flow[maxN];
int Q[maxM];
int Path[maxN];
bool inqueue[maxN];
void Add_Edge(int u,int v,int cost,int flow);
bool spfa1();
bool spfa2();
int main()
{
scanf("%d%d",&m,&n);
for (int i=1;i<=m;i++)
scanf("%d",&A[i]);
for (int i=1;i<=n;i++)
scanf("%d",&B[i]);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
scanf("%d",&Map[i][j]);
//min最小费用
memset(Head,-1,sizeof(Head));
cnt=-1;
for (int i=1;i<=m;i++)
Add_Edge(0,i,0,A[i]);
for (int i=1;i<=n;i++)
Add_Edge(i+m,n+m+1,0,B[i]);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
Add_Edge(i,j+m,Map[i][j],inf);
ll Ans=0;
while (spfa1())
{
int now=n+m+1;
int last=Path[now];
while (now!=0)
{
E[last].flow-=Flow[n+m+1];
E[last^1].flow+=Flow[n+m+1];
now=E[last].u;
last=Path[now];
}
Ans+=Dist[n+m+1]*Flow[n+m+1];
}
cout<<Ans<<endl;
//max最大费用
memset(Head,-1,sizeof(Head));
cnt=-1;
for (int i=1;i<=m;i++)
Add_Edge(0,i,0,A[i]);
for (int i=1;i<=n;i++)
Add_Edge(i+m,n+m+1,0,B[i]);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
Add_Edge(i,j+m,Map[i][j],inf);
Ans=0;
while (spfa2())
{
int now=n+m+1;
int last=Path[now];
while (now!=0)
{
E[last].flow-=Flow[n+m+1];
E[last^1].flow+=Flow[n+m+1];
now=E[last].u;
last=Path[now];
}
Ans+=Dist[n+m+1]*Flow[n+m+1];
}
cout<<Ans<<endl;
return 0;
}
void Add_Edge(int u,int v,int cost,int flow)
{
cnt++;
Next[cnt]=Head[u];
Head[u]=cnt;
E[cnt].u=u;
E[cnt].v=v;
E[cnt].cost=cost;
E[cnt].flow=flow;
cnt++;
Next[cnt]=Head[v];
Head[v]=cnt;
E[cnt].u=v;
E[cnt].v=u;
E[cnt].cost=-cost;
E[cnt].flow=0;
}
bool spfa1()
{
for (int i=0;i<=n+m+1;i++)
Dist[i]=inf;
int h=1,t=0;
Q[1]=0;
inqueue[0]=1;
Flow[0]=inf;
Dist[0]=0;
do
{
t++;
int u=Q[t];
inqueue[u]=0;
for (int i=Head[u];i!=-1;i=Next[i])
{
int v=E[i].v;
if ((E[i].flow>0)&&(Dist[v]>Dist[u]+E[i].cost))
{
Dist[v]=Dist[u]+E[i].cost;
Flow[v]=min(Flow[u],E[i].flow);
Path[v]=i;
if (inqueue[v]==0)
{
h++;
Q[h]=v;
inqueue[v]=1;
}
}
}
}
while (h!=t);
if (Dist[n+m+1]==inf)
return 0;
return 1;
}
bool spfa2()
{
for (int i=0;i<=n+m+1;i++)
Dist[i]=-inf;
int h=1,t=0;
Q[1]=0;
inqueue[0]=1;
Flow[0]=inf;
Dist[0]=0;
do
{
t++;
int u=Q[t];
inqueue[u]=0;
for (int i=Head[u];i!=-1;i=Next[i])
{
int v=E[i].v;
if ((E[i].flow>0)&&(Dist[v]<Dist[u]+E[i].cost))
{
Dist[v]=Dist[u]+E[i].cost;
Flow[v]=min(Flow[u],E[i].flow);
Path[v]=i;
if (inqueue[v]==0)
{
h++;
Q[h]=v;
inqueue[v]=1;
}
}
}
}
while (h!=t);
if (Dist[n+m+1]==-inf)
return 0;
return 1;
}
Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)的更多相关文章
- LibreOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题
#6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图
#6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- COGS738 [网络流24题] 数字梯形(最小费用最大流)
题目这么说: 给定一个由n 行数字组成的数字梯形如下图所示.梯形的第一行有m 个数字.从梯形的顶部的m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径.规则1:从梯形的 ...
- LIbreOJ #6011. 「网络流 24 题」运输问题 最小费用最大流
#6011. 「网络流 24 题」运输问题 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- 【刷题】LOJ 6011 「网络流 24 题」运输问题
题目描述 W 公司有 \(m\) 个仓库和 \(n\) 个零售商店.第 \(i\) 个仓库有 \(a_i\) 个单位的货物:第 \(j\) 个零售商店需要 \(b_j\) 个单位的货物.货物供需平衡, ...
- 2018.10.14 loj#6011. 「网络流 24 题」运输问题(费用流)
传送门 费用流入门题. 直接按照题意模拟. 把货物的数量当做容量建边. 然后跑一次最小费用流和最大费用流就行了. 代码: #include<bits/stdc++.h> #define N ...
- 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)
传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...
- 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)
传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...
- Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)
Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...
随机推荐
- c++对象模型-对象模型
1:简单对象模型 1>介绍:每个成员都使用一个指针指向真正的成员.所以对象 的大小很好确定,就是成员数*指针大小. 2>用途:成员函数就是使用这个模型的 3>图: 4>加上继承 ...
- 实例解析forEach、for...in与for...of
在开发过程中经常需要循环遍历数组或者对象,js也为我们提供了不少方法供使用,其中就有三兄弟forEach.for...in.for...of,这三个方法应该是使用频率最高的,但很多人却一值傻傻分不清, ...
- 语音笔记:CTC
CTC全称,Connectionist temporal classification,可以理解为基于神经网络的时序类分类.语音识别中声学模型的训练属于监督学习,需要知道每一帧对应的label才能进行 ...
- 【评分】Alpha阶段
[评分]Alpha阶段 总结 按时交 - 有分 晚交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 倒扣本次作业分数 请大家回忆一下第一次作业的总结:http://www.cnblogs.c ...
- nodejs框架对比
最近想实操nodejs,在选择框架的时候,查阅后大致整理为如下表格内容. 此处列举下才开始使用eggjs框架: 1.其基于koa开发: 2.若为企业级项目,用其脚手架egg-inint搭建会快很多,后 ...
- java.lang.Exception: No tests found matching Method tes(com.bw.test.Testrefiect) from org.junit.vintage.engine.descriptor.RunnerRequest@3bfdc050 at org.junit.internal.requests.FilterRequest.getRunner
junit 方法 没有加上注解 @Test java.lang.Exception: No tests found matching Method tes(com.bw.test.Testre ...
- php中获取数据 php://input、$_POST与$GLOBALS['HTTP_RAW_POST_DATA']三者的区别
$_POST 只有Coentent-Type的值为application/x-www.form-urlencoded和multipart/form-data两种类型时,$_POST才能获取到数据. $ ...
- Jquery 组 tbale表格隔行变色
<!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...
- delphi 通过事务插入数据
orsn1.StartTransaction; try qry1.Sql.Clear; qry1.Sql.Text:=' select * from log '; qry1.Open; qry1.In ...
- liunx上安装MySQL一个非常简单的方法
1.官网下载yum源 https://www.mysql.com/ 2.把yum源包上传到linux,安装. 执行命令安装 [root@bogon ~]# yum localinstall mysql ...