P4015 运输问题

文章目录

  • 题目描述:
  • 输入格式:
  • 输出格式:
  • 输入输出样例:
  • 题解:
  • 代码:

题目描述:

输入格式:

输出格式:

两行分别输出最小运输费用和最大运输费用。

输入输出样例:

输入 #1

2 3
220 280
170 120 210
77 39 105
150 186 122

输出 #1

48500
69140

题解:

最小费用最大流(MCMF)问题
根据样例数据分析:
橙色为第一个仓库晕倒各零售商店的单位费用
绿色为第二个

一边是仓库,一边是商店,典型的二分图,还是完全二分图
我们可以在仓库的左边设置一个源点S,右边设置一个终点T。S指向每一个仓库,容量为ai,费用为0,而每一个商店指向T,容量为bi,费用为0
从仓库到商店的边容量是min(仓库货物量ai,商店容量bi),费用为读入的值
为了方便处理,我们可以将S点记为编号1,仓库为编号1 ~ m,商店为m+1 ~ n+m,T点为201
然后直接跑最小费用最大流就可以了
找到最大后,将费用取反再跑一遍即可找到最小

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>#define I_copy_this_answer return 0;using namespace std;int n,m,head[1100];
int cnt=1;
int mincost,maxwater;
int flow[1100];
int b[1100],cost[310][310];
int pre[1100],last[1100],dis[1100],vis[1100],a[1100];
int s=0;
//last记录边,pre记录点
struct node{int next,to,dis,flow;
}edge[100860]; void addedge(int next,int to,int dis,int flow)
{edge[++cnt].to=to;edge[cnt].dis=dis;edge[cnt].flow=flow;edge[cnt].next=head[next];head[next]=cnt;
}int spfa()
{memset(flow,0x3f,sizeof(flow));memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof(vis));queue <int> q;q.push(s);dis[s]=0;vis[s]=1;pre[201]=-1;  //初始化汇点的前点 while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i;i=edge[i].next){int   v=edge[i].to;int w=edge[i].dis;int l=edge[i].flow;if(dis[u]+w<dis[v]&&l>0)  //没有流量的话这条路就增广不了,最短距离是建立在增广路存在的基础上的 {dis[v]=dis[u]+w;last[v]=i;  //last指的是这个点(v)与上个点(u)相连的边的编号 pre[v]=u;  //pre指的是这条路径上这个点(v)的上一个点 flow[v]=min(flow[u],l);  //把当前边流量与上个点的流量对比,解决出现仓库货物比需要的少的情况 if(!vis[v]){q.push(v);vis[v]=1;}}}}return pre[201]!=-1;  //如果不是这个值就说明这个点被刷新,增广成功
}void mcmf()
{while(spfa()){mincost+=dis[201]*flow[201];   //从源点出发到汇点的单位费用再乘以单位,由于每次只增广一条路,而且仓库和商店是直接连接的,可以这样写 int t=201;while(t!=0){edge[last[t]].flow-=flow[201];  //回溯,修改每条边的流量,因为该算法中途找到的增广路不是最后的增广路,所以这个要等到最后来改变 edge[last[t]^1].flow+=flow[201];t=pre[t];}}
}void build_edge(int t)//t用来控制边权的正负,为了方便求最小和最大
{for(int i=1;i<=m;i++){addedge(0,i,0,a[i]);addedge(i,0,0,0);//与源点S相连 } for(int i=1;i<=m;i++)for(int j=1;j<=n;j++){addedge(i,j+m,cost[i][j]*t,b[j]);addedge(j+m,i,-cost[i][j]*t,0);//仓库与商店相连 }for(int i=1;i<=n;i++){addedge(i+m,201,0,b[i]);//与汇点T相连 addedge(201,i+m,0,0);}
}int main()
{int i,j;scanf("%d %d",&m,&n);for(i=1;i<=m;i++){int t1;scanf("%d",&a[i]);    }for(i=1;i<=n;i++)scanf("%d",&b[i]);for(i=1;i<=m;i++)for(j=1;j<=n;j++)scanf("%d",&cost[i][j]);  //仓库与商店的边权 build_edge(1);  //建立边权为正的边,跑最小费用最大流 mcmf();//最小费用最大流(Min Cost Max Flow )的缩写 printf("%d",mincost); maxwater=0;mincost=0; cnt=1;memset(head,0,sizeof(head));build_edge(-1);//建立边权为符的边 mcmf();printf("\n%d",-mincost);
}

P4015 运输问题相关推荐

  1. 洛谷 P4015 运输问题(费用流)

    运输问题 题目描述 W W W 公司有 m m m 个仓库和 n n n 个零售商店.第 i i i 个仓库有 a i a_i ai​ 个单位的货物:第 j j j 个零售商店需要 b j b_j b ...

  2. 洛谷P4015 运输问题 网络流24题

    看了下SPFA题解,一个一个太麻烦了,另一个写的很不清楚,而且注释都变成了"????"不知道怎么过的,于是自己来一发SPFA算法. Part 1.题意 M 个仓库,卖给 N 个商店 ...

  3. 洛谷 - P4015 运输问题(费用流)

    题目链接:点击查看 题目大意:有n个卖家和m个买家,每个卖家会卖ai个物品,每个买家会买bi个物品,每个卖家向每个卖家卖东西会有一定的代价,问如何匹配才能让代价最小/最大 题目分析:和上一道题大同小异 ...

  4. 洛谷——网络流24题

    P2756 飞行员配对方案问题 P2762 太空飞行计划问题 P4014 分配问题 P2774 方格取数问题 P4009 汽车加油行驶问题 P4015 运输问题 P3254 圆桌问题 P2763 试题 ...

  5. python运输问题_叶片运输优化问题学习笔记

    在之前负责的风电项目叶片发运过程中,涉及到一些运输问题.恰好最近学习了一点优化方面的知识,这里对叶片的发运问题做一个优化. 问题背景: 当前项目为一个100MW的风电电站,场地位于B国境内. 设计拟选 ...

  6. [codevs 1914] 运输问题

    [codevs 1914] 运输问题 题解: 直接看要求建图,求费用流取相反数输出,再改边费用求费用流输出. 代码: 总时间耗费: 58ms  总内存耗费: 364B #include<cstd ...

  7. lingo变量无限制版本_【运筹学】用Lingo求解运输问题,兼谈Lingo语法

    一. 运输模型 设有 个产地 其产量(供应量)分别为 : 个销地 , 其销量(需求量)分别为 :从产地 运往销地 的运费为 . 假设产销平衡,问如何安排运输方案能使总运费最小? 这就是经典的运输问题, ...

  8. 算法优化:动态规划加速,货物运输问题,四边形不等式, 从O(n^2)到O(n^3)

    货物运输问题 递归方程为: 更为一般形式的递归方程 看起来是不是像可以使用分治的策略实现,但是min里面子问题太多了,只能使用动态规划的招了. i,j是什么含义了?动态规划里i,j都是指的是问题规模, ...

  9. c++调用cplex求解例子_Java调用cplex求解运输问题

    Java调用cplex求解运输问题 本文中的课件来自清华大学深圳国际研究生院,物流与交通学部张灿荣教授<生产管理>课程. 运输问题(Transportation Problem)描述 运输 ...

最新文章

  1. ue4 函数和宏区别_【UE4】通俗易懂 用蓝图来学习 C++ 基础知识
  2. (八)适配器模式详解
  3. 3、MySQL优化数据库结构的3种方法
  4. 基于人工神经网络的识别C语言,实验一基于人工神经网络的数码识别.doc
  5. android listview 开发,android开发之ListView实现
  6. linux的基础知识——正则表达式
  7. Java核心类库篇2——lang
  8. JavaScript异步编程【上】 -- 同步和异步、事件循环(EventLoop)、微任务和宏任务、回调函数
  9. Python 机器学习 随机森林 天气最高温度预测任务(二)
  10. 在centos上安装html,Centos-7安装pdf2htmlEX
  11. 经验总结21--抓取WEB数据,汇率,HtmlAgilityPack
  12. 我与51CTO的战争之值得尊敬的对手
  13. f分布表完整图a=0.01_第7章 分布分析
  14. 华为应用市场AGC研习社直播:App个人信息安全保护审核标准解读
  15. windows11切换输入法的快捷键是什么?win11怎样修改输入法快捷键
  16. c语言实现utf-8编码解码器
  17. SAP 创建可选BOM的BAPI
  18. 程序员作死手册:我们是怎样弄丢1400万条日志记录的
  19. 因特网,万维网,互联网什么区别?
  20. 基于SSM框架的图片分享及评价网站设计与实现 毕业设计-附源码201524

热门文章

  1. java里面什么时候环境变量_Java的环境变量什么时候需要设置?
  2. python join_python join 和 split的常用使用方法
  3. kivy中文手册python_K-Meleon
  4. 教之初计算机考试函数应用题,教之初计算机考试系统
  5. java mongodb 批量删除_MONGODB删除/新增/更改大量记录的方法
  6. 中南民族大学c语言报告,中南民族大学信C语言实验报告.doc
  7. python是c语言_python与c语言
  8. java的正则表达式 CPU_小心踩雷!一个小小的正则表达式竟把CPU拖垮......
  9. linux gcc出错,编译arm-linux-gcc出错
  10. qt制作一个画板_如何直接用Sketch制作动画|Sketch插件|