第一次见到这样的题,真的是看别人的思想然后看别人的代码了一晚上,先明白别人的代码的意思,但是不懂为什么那么写,然后画个图忽然就明白了,下面就是根据这道题最初最小费用最大流的分析!

题目大意:给出n个客户对k个商品的需求量,又给出m个仓库对k个物品的存货量以及对k个物品从i仓库到j客户的一个物品的运费价格,让判断是否可以满足客户需求,然后就是如果满足求出最小的运费,是典型的最小费用最大流!

题目解析:可以将k中物品分开求最小然后想加!

建图,对每个仓库是一个结点,每个客户也是一个结点,除此之外再加上s源点和t结束点!

1、s到仓库i的边的权值为仓库i的供给量

2、仓库i到客户j的权值为仓库的供给量

3、客户j到t的权值为客户的需求量

4、还有建立花费图,cost[i][j]代表仓库i到客户j的没一个物品的运费

然后用spfa算法求s到t的最小路径(路径上边的权值不为0),如果到t的最短路径有更新(此条路径话费最少),则记录这条路径,求出这条路径上权值最小的边的权值,然后这条路径上所有的边的权值都减去该边的权值min,此时最小的花费增加了min*在这条边上的花费!如果s到t的值没有更新,则对于k物品的最小花费则已经求出来了!

表达能力不强,脑袋清楚说不出来,下面是代码,如果实在不明白的话就好好看看代码哈!

[html]view plaincopyprint?
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<string>
  4. #include<cmath>
  5. #include<queue>
  6. using namespace std;
  7. #define min(a,b) (a)<(b)?(a):(b)
  8. #define N 130
  9. #define inf 100000000
  10. int need[N][N];
  11. int offer[N][N];
  12. int map[N][N],cost[N][N];
  13. int sum_need[N],sum_offer[N];
  14. int n,m,K;
  15. int pre[N];
  16. int s,t;//源点和结束点
  17. int spfa()
  18. {
  19. int dis[N];
  20. bool vis[N];
  21. int i;
  22. queue<int>q;
  23. for(i=0; i<=t; i++)
  24. {
  25. vis[i]=false;
  26. dis[i]=inf;
  27. }
  28. vis[s]=true;
  29. dis[s]=0;
  30. q.push(s);
  31. while(!q.empty())
  32. {
  33. int k=q.front();
  34. vis[k]=false;
  35. q.pop();
  36. for(i=0; i<=t; i++)
  37. {
  38. if(map[k][i] && dis[i]>dis[k]+cost[k][i])
  39. {
  40. dis[i]=dis[k]+cost[k][i];
  41. pre[i]=k;
  42. if(vis[i]==false)
  43. {
  44. vis[i]=true;
  45. q.push(i);
  46. }
  47. }
  48. }
  49. }
  50. if(dis[t]!=inf)
  51. return 1;
  52. else
  53. return 0;
  54. }
  55. int fond()
  56. {
  57. int i,j;
  58. int Min=INT_MAX;
  59. j=0;
  60. while(spfa())
  61. {
  62. for(i=t;i!=s; i=pre[i])
  63. Min=min(Min,map[pre[i]][i]);
  64. for(i=t; i!=s; i=pre[i])
  65. {
  66. map[pre[i]][i]-=Min;
  67. map[i][pre[i]]+=Min;
  68. j+=cost[pre[i]][i]*Min;
  69. }
  70. }
  71. return j;
  72. }
  73. int main()
  74. {
  75. int i,j,k,sum,sign;
  76. while(scanf("%d%d%d",&n,&m,&K))
  77. {
  78. if(n==0 && m==0 && K==0)
  79. break;
  80. sum=0;
  81. memset(sum_need,0,sizeof(sum_need));
  82. memset(sum_offer,0,sizeof(sum_offer));
  83. for(i=1; i<=n; i++)
  84. for(j=1; j<=K; j++)
  85. {
  86. scanf("%d",&need[i][j]);
  87. sum_need[j]+=need[i][j];
  88. }
  89. for(i=1; i<=m; i++)
  90. for(j=1; j<=K; j++)
  91. {
  92. scanf("%d",&offer[i][j]);
  93. sum_offer[j]+=offer[i][j];
  94. }
  95. sign=0;
  96. for(i=1; i<=K; i++)
  97. if(sum_offer[i]<sum_need[i])
  98. {
  99. sign=1;
  100. break;
  101. }
  102. s=0;
  103. t=m+n+1;
  104. for(k=1; k<=K; k++)
  105. {
  106. for(i=0; i<=t; i++)
  107. for(j=0; j<=t; j++)
  108. map[i][j]=cost[i][j]=0;
  109. for(i=1+m; i<=n+m; i++)
  110. for(j=1; j<=m; j++)
  111. {
  112. scanf("%d",&cost[j][i]);
  113. cost[i][j]=-cost[j][i];
  114. }
  115. if(sign==1)
  116. continue;
  117. for(i=1; i<=m; i++)
  118. map[s][i]=offer[i][k];
  119. for(i=1; i<=m; i++)
  120. for(j=1+m; j<=n+m; j++)
  121. map[i][j]=offer[i][k];
  122. for(i=m+1; i<=m+n; i++)
  123. map[i][t]=need[i-m][k];
  124. sum+=fond();
  125. }
  126. if(sign==1)
  127. printf("-1\n");
  128. else
  129. printf("%d\n",sum);
  130. }
  131. return 0;
  132. }

poj2516 最小费用最大流相关推荐

  1. 网络流之——最小费用最大流

    学习最小费用最大流前,需要学习最大流算法.在最大流算法中,没有考虑边的费用问题.在MinCostMaxFlow中,引入了费用的概念:cij表示边(i,j)单位流量的费用.在满足流量=v(f)的同时,并 ...

  2. 最小费用最大流及习题(poj)

    该算法讲解来源:https://www.cnblogs.com/gtarcoder/p/4890739.html 最小费用最大流 通过EK,Dinic,ISAP算法可以得到网络流图中的最大流,一个网络 ...

  3. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  4. POJ - 2516 Minimum Cost 最小费用最大流

    题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...

  5. pku The Windy's KM最小权匹配 or 最小费用最大流

    http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...

  6. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

  7. 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)

    题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai​,ai+n​一个点为入点,一个为出点这条边的流量范围 ...

  8. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)

    题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...

  9. Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...

最新文章

  1. 达摩院NLP团队斩获六项世界冠军背后,让AI没有难懂的语言
  2. 科技边框_爱旭科技首创双面PERC电池PID FREE解决方案
  3. Android中的URI
  4. python代码大全表解释-.python3基础之“术语表(1)”
  5. jzoj6305-最小值【线段树,dp,双端链表】
  6. 第五十七期:小型企业将如何从5G中受益
  7. 一周学C#之第4天——语句
  8. 滚动字幕的源代码(可作滚动公告)
  9. 汽车门店管理系统 php,大型汽车4s店维修管理系统多门店版(源码+数据库+截图)...
  10. 2022年上半年软件设计师下午真题试题(案例分析)及答案
  11. rsyslog+elk 网络设备日志收集及钉钉报警
  12. Python标准库:内置函数complex([real[, imag]])
  13. Bupt桌游馆--共享资源清单
  14. 12.9寸iPad Pro 5曝光:屏幕焕然一新、处理器强悍
  15. 最短路——最短路计数(spfa)
  16. android 远程控制 盒子,真正远程控制你的盒子(局域网和互联网)
  17. 修复 rk3288 android9 的一些问题
  18. css 实现居中对齐的几种方式
  19. A4纸网页打印 html网页页面的宽度设置成多少
  20. Premiere使用教程(二)界面介绍

热门文章

  1. 【Android 逆向】函数拦截 ( 修改内存页属性 | x86 架构插桩拦截 )
  2. 【错误记录】Android Studio Logcat 报错 ( read: unexpected EOF! )
  3. 【Flutter】Animation 动画 ( Flutter 动画的核心类 | Animation | CurvedAnimation | AnimationController | Tween )
  4. 【错误记录】Flutter 构建报错 ( Because xxx requires SDK version >=2.12.0-0 <3.0.0, versio | Dart SDK 版本低 )
  5. 【Android应用开发】RecycleView API 翻译 (文档翻译)
  6. [Spring cloud 一步步实现广告系统] 15. 使用开源组件监听Binlog 实现增量索引准备...
  7. 初识HTML和WEB标准
  8. Linux 查看 80 端口的占用情况
  9. 技术分享-bounds的深入认识
  10. 局部和匿名类型作模板实参