题目描述

传送门

题解

从源点向每一个仓库连边,费用为0,容量为仓库中货物数量;
从每一个零售店向汇点连边,费用为0,容量为零售店应得的货物数量;
从仓库向零售店连边,费用为该仓库运到零售店的费用。
跑最大费用和最小费用即可。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;const int max_n=105;
const int max_m=105;
const int max_N=max_n*max_m+2;
const int max_M=max_n*max_m*10;
const int max_e=max_M*2;
const int INF=1e9;int n,m,N,mincost,maxcost;
int A[max_n],B[max_m],C[max_n][max_m];
int point[max_N],next[max_e],v[max_e],remain[max_e],c[max_e],tot;
int last[max_N],dis[max_N];
bool vis[max_N];
queue <int> q;inline void clear(){tot=-1;memset(point,-1,sizeof(point));memset(next,-1,sizeof(next));memset(v,0,sizeof(v));memset(remain,0,sizeof(remain));memset(c,0,sizeof(c));memset(last,0,sizeof(last));memset(dis,0,sizeof(dis));memset(vis,0,sizeof(vis));
}inline void addedge(int x,int y,int cap,int z){++tot; next[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=cap; c[tot]=z;++tot; next[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0; c[tot]=-z;
}inline int addflow(int s,int t){int ans=INF,now=t;while (now!=s){ans=min(ans,remain[last[now]]);now=v[last[now]^1];}now=t;while (now!=s){remain[last[now]]-=ans;remain[last[now]^1]+=ans;now=v[last[now]^1];}return ans;
}inline bool bfs_min(int s,int t){memset(dis,0x7f,sizeof(dis));dis[s]=0;memset(vis,0,sizeof(vis));vis[s]=true;while (!q.empty()) q.pop();q.push(s);while (!q.empty()){int now=q.front(); q.pop();vis[now]=false;for (int i=point[now];i!=-1;i=next[i])if (dis[v[i]]>dis[now]+c[i]&&remain[i]){dis[v[i]]=dis[now]+c[i];last[v[i]]=i;if (!vis[v[i]]){vis[v[i]]=true;q.push(v[i]);}}}if (dis[t]>INF) return false;int flow=addflow(s,t);mincost+=flow*dis[t];return true;
}inline bool bfs_max(int s,int t){memset(dis,128,sizeof(dis));dis[s]=0;memset(vis,0,sizeof(vis));vis[s]=true;while (!q.empty()) q.pop();q.push(s);while (!q.empty()){int now=q.front(); q.pop();vis[now]=false;for (int i=point[now];i!=-1;i=next[i])if (dis[v[i]]<dis[now]+c[i]&&remain[i]){dis[v[i]]=dis[now]+c[i];last[v[i]]=i;if (!vis[v[i]]){vis[v[i]]=true;q.push(v[i]);}}}if (dis[t]<0) return false;int flow=addflow(s,t);maxcost+=flow*dis[t];return true;
}inline void major_min(int s,int t){mincost=0;while (bfs_min(s,t));
}inline void major_max(int s,int t){maxcost=0;while (bfs_max(s,t));
}int main(){clear();scanf("%d%d",&n,&m);N=n+m+2;for (int i=1;i<=n;++i){scanf("%d",&A[i]);addedge(1,1+i,A[i],0);}for (int i=1;i<=m;++i){scanf("%d",&B[i]);addedge(1+n+i,N,B[i],0);}for (int i=1;i<=n;++i)for (int j=1;j<=m;++j){scanf("%d",&C[i][j]);addedge(1+i,1+n+j,INF,C[i][j]);}major_min(1,N);clear();for (int i=1;i<=n;++i)addedge(1,1+i,A[i],0);for (int i=1;i<=m;++i)addedge(1+n+i,N,B[i],0);for (int i=1;i<=n;++i)for (int j=1;j<=m;++j)addedge(1+i,1+n+j,INF,C[i][j]);major_max(1,N);printf("%d\n",mincost);printf("%d\n",maxcost);
}

总结

①重新建图。

[网络流24题][CODEVS1914]运输问题(费用流)相关推荐

  1. 餐巾计划问题 线性规划与网络流24题之10 费用流

    相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...

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

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

  3. [网络流24题] COGS 运输问题1

    11. 运输问题1 ★★☆   输入文件:maxflowa.in   输出文件:maxflowa.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述]     一个工厂每天 ...

  4. 【网络流24题】餐巾计划问题(最小费用最大流)

    [网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 ...

  5. 739. [网络流24题] 运输问题

    739. [网络流24题] 运输问题 ★★   输入文件:tran.in   输出文件:tran.out   简单对比 时间限制:1 s   内存限制:128 MB «问题描述: «编程任务: 对于给 ...

  6. 【网络流24题】魔术球问题(最大流)

    [网络流24题]魔术球问题(最大流) 题面 Cogs 题解 是不是像极了最小路径覆盖? 因此,我们枚举放到哪一个球(也可以二分) 然后类似于最小路径覆盖的连边 因为一根柱子对应一个路径的覆盖 所以,提 ...

  7. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

    «问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...

  8. 【网络流24题】星际转移问题(最大流)

    [网络流24题]星际转移问题(最大流) 题面 Cogs 题解 因为天数是未知的,所以我们要想办法处理天数 可以选择二分或者依次累加天数 因为数据范围较小,使用二分可能反而复杂度会增高 所以使用不断累加 ...

  9. 【网络流24题】圆桌聚餐(最大流)

    [网络流24题]圆桌聚餐(最大流) 题面 Cogs 题解 这道题很简单 首先每个单位的人数限制 直接从源点向单位连边,容量为人数 同样的, 每个桌子向汇点连边,容量为可以坐的人数 因为每个桌子只能够做 ...

最新文章

  1. javascript转换
  2. C++ Primer 5th笔记(chap 11)关联容器---无序容器
  3. B 站硬件大佬在 GitHub 上开源了一款神器
  4. 用html5播放两个视频,HTML5视频 - 如何进行无缝播放和/或几个视频循环?
  5. Roadblocks(次短路经)
  6. 概率占据图(POM)算法理解
  7. 独家直播!阿里移动前端开源框架Weex揭秘
  8. PHP服务Fcgi进程及PHP解析优化
  9. 【Elasticsearch】如何正确的关闭 重启 Elasticsearch集群
  10. Adroid我还是个菜鸟——导入jar包
  11. 计算机人工智能领域英文文献,人工智能英文文献译文.doc
  12. 【Unreal】关于实时编码(live coding)退出UE编辑器C++ Class消失的问题
  13. 并发测试工具Jmeter安装与简单使用
  14. 2018第九届蓝桥杯B组决赛题解第四题 调手表(BFS)
  15. CapstoneCS5212|CapstoneCS5218|DP转VGA1080P方案设计| DP转HDMI4K 30Hz方案设计
  16. Tomcat 8 性能优化
  17. [hackthebox]shibboleth
  18. 【往届会议已EI检索】第六届管理工程、软件工程与服务科学国际会议
  19. 传感器i2c与arduino连接_如何在两个Arduino开发板之间使用I2C总线进行通信
  20. 择校秘籍|北邮计算机 和 北航计算机 应该怎么选?

热门文章

  1. 如何让自己保持学习的欲望
  2. vue3 刷新当前页面(provide,inject)
  3. 艾宾浩斯记忆法-背单词(转于百度百科)
  4. 小小程序员2017年终总结
  5. 什么是虚拟机,虚拟机的作用是什么?
  6. matlab中交流电源,嵌入Matlab/Simulink平台的交流变压变频电源仿真模块的设计
  7. Python进阶,使用 opencv 调用摄像头进行拍照
  8. Secret Data Cage防泄密软件
  9. 数据团队结构怎么搭?
  10. 拓扑排序[TopologicalSort]