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. 案例学Python--案例四:Django实现一个网站的雏形(2)

    续上篇,用Django创建了一个Web,我们肯定想展示自己的页面,简单点,我们想看到自己的HelloWorld.此处要从项目的配置说起,方法和路径配对了,展现页面分分钟的事情. 先上效果图吧:     ...

  2. [UWP 自定义控件]了解模板化控件(7):支持Command

    以我的经验来说,要让TemplatedControl支持Command的需求不会很多,大部分情况用附加属性解决这个需求会更便利些,譬如UWPCommunityToolkit的HyperlinkExte ...

  3. Steamworks上传游戏

    1.在steamPipe下配置Depot,每个Depot表示程序对应的分支配置语言,操作系统,架构组合等 2.安装,启动项目是配置游戏启动文件的相关信息,不同的操作系统架构等需要添加不同的启动项 3. ...

  4. 个人作业Week3

    个人作业week3 一.  调研,评测 1.我的使用体验 版本:IOS版   BUG_1: 点击单词本中的“同步”后,会提示登录Microsoft账户.登录成功立即开始同步单词本.在单词本同步过程中, ...

  5. 个人项目Week1

    一.项目时间规划与实际用时 PSP2.1 Personal Software Process Stages 预计时间/h 实际时间/h Planning 计划     · Estimate · 估计这 ...

  6. Rop框架学习笔记

    1.  提供了开发服务平台的解决方案:比如应用认证.会话管理.安全控制.错误模型.版本管理.超时限制 2.  启动:RopServlet截获http请求 配置: <servlet> < ...

  7. “数学口袋精灵”第二个Sprint计划(第六~八天)

    “数学口袋精灵”第二个Sprint计划----第六天~第八天进度 任务分配: 冯美欣:欢迎界面的背景音乐完善 吴舒婷:游戏界面的动作条,选择答案后的音效 林欢雯:代码算法设计 第六天: 进度: 冯美欣 ...

  8. Maven Archetype简介以及搭建

    为什么会写这篇文章,因为公司先在构建项目骨架都是用的 maven archetype ,身为一个上进的渣渣猿,自己还是有必要了解下这个东西的. Archetype介绍 Archetype 是一个 Ma ...

  9. rabbitmq代码配置

    package com.qukoucai.test; import com.rabbitmq.client.AMQP;import com.rabbitmq.client.AMQP.BasicProp ...

  10. Java之JSON操作(Jackson)

    Java to JSON: package json.jackson; import bean.User; import com.fasterxml.jackson.databind.ObjectMa ...