「网络流24题」「LuoguP4015」 运输问题
Description
W 公司有 m 个仓库和 n 个零售商店。第 i 个仓库有 ai 个单位的货物;第 j 个零售商店需要 bj 个单位的货物。
货物供需平衡,即 ∑ai=∑bj 。
从第 i 个仓库运送每单位货物到第 j 个零售商店的费用为 cij 。
试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少。
Input
第 1 行有 2 个正整数 m 和 n ,分别表示仓库数和零售商店数。
接下来的一行中有 m 个正整数 ai ,表示第 i 个仓库有 ai 个单位的货物。
再接下来的一行中有 n 个正整数 bj ,表示第 j 个零售商店需要 bj 个单位的货物。
接下来的 m 行,每行有 n 个整数,表示从第 i 个仓库运送每单位货物到第 j 个零售商店的费用 cij 。
Output
两行分别输出最小运输费用和最大运输费用。
Sample Input
2 3
220 280
170 120 210
77 39 105
150 186 122
Sample Output
48500
69140
Hint
1≤n,m≤100
题解
学YJQ大佬用记事本打代码的第一题
这 跟上一道题有什么区别吗?!「网络流24题」负载平衡问题
还是有点区别的
从s往每个仓库连边,容量ai 费用0
从每个商店向t连边,容量bj 费用0
每个仓库向每个商店连边 容量INF 费用cij
还讲一下记事本打代码的初体验吧
注意力瞬间集中是真的,没那么在意手速也是真的
挂了两次 第一次CE(dfs(x,INF)
第二次 居然挂在n,m反向读入???woc???
果然还是个菜鸡啊QAQ
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define R register
const int INF=999999999;
int n,m,s,t;
struct emm{
int e,f,v,c;
}a[100007];
int h[207];
int tot=1;
void con(int u,int v,int w,int f)
{
a[++tot].f=h[u];
h[u]=tot;
a[tot].e=v;
a[tot].v=w;
a[tot].c=f;
a[++tot].f=h[v];
h[v]=tot;
a[tot].e=u;
a[tot].c=-f;
return;
}
void scan()
{
scanf("%d%d",&m,&n);
s=0,t=n+m+1;
for(R int i=1;i<=m;++i)
{
int x;
scanf("%d",&x);
con(s,i,x,0);
}
for(R int i=1;i<=n;++i)
{
int x;
scanf("%d",&x);
con(i+m,t,x,0);
}
for(R int i=1;i<=m;++i)
for(R int j=1;j<=n;++j)
{
int x;
scanf("%d",&x);
con(i,j+m,INF,x);
}
return;
}
queue<int>q;
bool sf[207];
int d[207];
bool spfa()
{
memset(sf,0,sizeof(sf));
memset(d,127,sizeof(d));
d[s]=0;sf[s]=1;q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=h[x];i;i=a[i].f)
if(d[a[i].e]>d[x]+a[i].c&&a[i].v)
{
d[a[i].e]=d[x]+a[i].c;
if(!sf[a[i].e])
{
sf[a[i].e]=1;
q.push(a[i].e);
}
}
sf[x]=0;
}
return d[t]<INF;
}
long long ans=0;
int dfs(int x,int al)
{
if(x==t||!al)return al;
int fl=0;
for(int i=h[x];i;i=a[i].f)
if(d[a[i].e]==d[x]+a[i].c&&a[i].v&&!sf[a[i].e])
{
sf[a[i].e]=1;
int f=dfs(a[i].e,min(al,a[i].v));
if(f)
{
fl+=f;
al-=f;
ans+=f*a[i].c;
a[i].v-=f;
a[i^1].v+=f;
if(!al)break;
}
}
if(!fl)d[x]=-INF;
return fl;
}
void run()
{
while(spfa())
{
sf[t]=1;
while(sf[t])
{
memset(sf,0,sizeof(sf));
dfs(s,INF);
}
}
cout<<ans<<endl;
for(int i=2;i<=tot;i+=2)
{
a[i].v+=a[i^1].v;
a[i^1].v=0;
swap(a[i].c,a[i^1].c);
}
ans=0;
while(spfa())
{
sf[t]=1;
while(sf[t])
{
memset(sf,0,sizeof(sf));
dfs(s,INF);
}
}
cout<<-ans<<endl;
return;
}
int main()
{
scan();
run();
return 0;
}
下次要用没有自动对齐的纯·记事本 2333
「网络流24题」「LuoguP4015」 运输问题的更多相关文章
- LOJ6003 - 「网络流 24 题」魔术球
原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...
- LOJ6002 - 「网络流 24 题」最小路径覆盖
原题链接 Description 求一个DAG的最小路径覆盖,并输出一种方案. Solution 模板题啦~ Code //「网络流 24 题」最小路径覆盖 #include <cstdio&g ...
- LOJ6001 - 「网络流 24 题」太空飞行计划
原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...
- LOJ6000 - 「网络流 24 题」搭配飞行员
原题链接 题意简述 求二分图的最大匹配. 题解 这里写的是匈牙利算法. 表示节点的当前匹配. 为真表示在这一轮匹配中,无法给节点一个新的匹配.所以如果为真就不用再dfs它了,直接continue就好. ...
- LibreOJ #6014. 「网络流 24 题」最长 k 可重区间集
#6014. 「网络流 24 题」最长 k 可重区间集 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 ...
- Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)
Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...
- Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)
Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...
- Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)
Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...
- LibreOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题
#6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
随机推荐
- PAT (Advanced Level) 1089. Insert or Merge (25)
简单题.模拟一下即可. #include<cstdio> #include<cstring> #include<cmath> #include<vector& ...
- Effective Java P2 Creating and Destroying Objects
This chapter concerns creating and destorying objects : when and how to create them, when and how to ...
- Windows下拷贝Linux的文件到本地(Putty)
去官网下载的Putty中包含了如下文件: 其中pscp.exe是一个远程复制文件的工具. 官网:https://www.chiark.greenend.org.uk/~sgtatham/putty/l ...
- 微信公众账户的开发者模式(一) 部分细节access_token的获取等
十四老久没有写博客了,中间经历了,事业,感情的几分波折.现在终于稍微缓过来一点.又是一次从头开始,走在匆忙的路上. 好了煽情完了,直接上代码了. 基础就不说了我用的是vs2005开发的,部署在iis6 ...
- 实时获取键盘高度 CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
注意:要想实时获取键盘的高度,比如当前如果是中文那么就会增高的.那么需要使用 UIKeyboardFrameEndUserInfoKey 而不是 UIKeyboardFrameBeginUserIn ...
- BUPT复试专题—内存分配(2014-2)
题目描述 在操作系统中,内存分配是非常重要的工作.己知内存空间由N个内存块组成,这些内存块从1到N编号.进行内存分配时,操作系统将选择一块大小足够的内存全部分配给请求内存的进程.例如,当进程请求10M ...
- NPOI操作Excel 005:写入空Excel(Winform版)
前文写了一个BS版本号的导出Excel的样例(http://blog.csdn.net/yysyangyangyangshan/article/details/47904119).对于CS版在保存的地 ...
- free命令具体解释——Linux性能分析
一.使用格式 语法格式:free [-b | -k | -m] [-o] [-s delay ] [-t] [-l] [-V] [-b | -k | -m] :选择数据的单位-b字节.-k千字节.-m ...
- WPF中如何使用代码操作数据模板生成的控件
有一个Listbox,里面的Item是通过数据模板生成的,如下所示: <Border Margin="15" BorderBrush="Aqua" Bor ...
- 小心APP应用让你成为“透明人”
随着智能手机和平板电脑的迅猛发展,各式各样的APP在涌入这些移动终端的同一时候.吸费.窃取隐私等恶意程序也随之盛行. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5u ...