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 题」运输问题 (网络流,最小费用最大流)的更多相关文章

  1. LibreOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题

    #6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  2. LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图

    #6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  3. COGS738 [网络流24题] 数字梯形(最小费用最大流)

    题目这么说: 给定一个由n 行数字组成的数字梯形如下图所示.梯形的第一行有m 个数字.从梯形的顶部的m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径.规则1:从梯形的 ...

  4. LIbreOJ #6011. 「网络流 24 题」运输问题 最小费用最大流

    #6011. 「网络流 24 题」运输问题 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  5. 【刷题】LOJ 6011 「网络流 24 题」运输问题

    题目描述 W 公司有 \(m\) 个仓库和 \(n\) 个零售商店.第 \(i\) 个仓库有 \(a_i\) 个单位的货物:第 \(j\) 个零售商店需要 \(b_j\) 个单位的货物.货物供需平衡, ...

  6. 2018.10.14 loj#6011. 「网络流 24 题」运输问题(费用流)

    传送门 费用流入门题. 直接按照题意模拟. 把货物的数量当做容量建边. 然后跑一次最小费用流和最大费用流就行了. 代码: #include<bits/stdc++.h> #define N ...

  7. 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)

    传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...

  8. 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)

    传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...

  9. Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)

    Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...

随机推荐

  1. ElasticSearch实践系列(一):安装

    Elasticsearch简介 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎.它允许您快速,近实时地存储,搜索和分析大量数据.它通常用作底层引擎/技术,为具有复杂搜索功能和要求的 ...

  2. MVC使用Redis实现分布式锁

    使用场景 在做Web项目的时候,有很多特殊的场景要使用到锁 比如说抢红包,资源分配,订单支付等场景 就拿抢红包来说,如果一个红包有5份,同时100个人抢如果没有用到锁的话 100个人同时并发都抢成功, ...

  3. 如何利用Android Studio打包React Native APK

    ok!百度出来的东西很杂,所以,这里介绍一种最简单,最合适我们(新手,应该是吧)的APK的打包方式! 当然!这种打包是基于Android Studio的,所以,注意喽!!!! 废话不多说开始吧! 首先 ...

  4. 阅读<构建之法>13、14、15、16、17章

    13章 这么多测试为什么不能整理出一个包括所有功能的测试呢?看着那么多测试都感觉奇怪了. 14章 怎样才能体现一个测试人员的工作价值呢?这样的判断又是否会太独断了? 15章 在时间上,会不会因不同功能 ...

  5. Java Swing 实现系统托盘图标

    在实现托盘图标时,出现弹出式菜单显示中文乱码,无法显示正确的文字 查询相关资料后发现是字符编码不匹配,查询资料出处 解决方法 1.通过修改Java项目的默认编码为GBK: 2.在Run Configu ...

  6. JavaScript封装方法,兼容参数类型为Number和String

    /** * 依据Kind确定跳转到目标列表页面. * @param kind */ function gobackByKind(kind) { var kindStr = String(kind); ...

  7. RBAC权限控制系统

    1.概述 RBAC(Role-Based Access Control )基于角色的访问控制. RBAC的权限控制可以抽象概括为:判断[Who是否可以对What进行How的访问操作(Operator) ...

  8. Excel 使用AutoFill提示“类Range的AutoFill方法无效”

    今天遇到一个神奇的问题,之前一直使用很好的代码突然报错:“类Range的AutoFill方法无效”,在网上搜索了一番,感觉没有一个与我遇到的情况相同的.debug,查看一下代码,发现程序里,AutoF ...

  9. ERP启动会

    一个信念: 只许成功,不许失败. 二个原则: 第一个原则是“业务为主,IT为辅”的实施原则: 第二个原则是“循序渐进,持续改善”的工作原则. 三点要求: 第一点,各分公司.各部门的负责人要将ERP信息 ...

  10. 关于python项目路径导入自己写的库出错的一点思考

    其实也是在写自己项目的时候遇到的,以前也遇到了但是一直采取的是回避的策略,这次总算弄清楚所以总结一下. 这个项目的顶级目录是medivac,他本身是一个python模块. 熟悉flask的人都知道,在 ...