1. 最佳匹配的题,m个仓库供应k种商品给n个商家,m*n条运输代价互异,求满足商家需求下的最小运输费用
  2. 显然,如果某种商品的供货量比需求大,肯定是无法达到要求的,所以开始要判别是否可以得到最佳匹配
  3. 这个题非常有启发意义,刚开始把k种商品一并考虑,tle了,想来也是,这样X集合中的点为m*k,Y中集合为n*k;
  4. 执行最小费用流这个复杂度为O(n^3)的算法在这个题目是不可以行的
  5. 考虑到k种商品是相互独立的,所以见k次图,每次图中的点为n+m+2个,这样就可以在时限内出答案了
  6. */
  7. #include <stdio.h>
  8. #include <iostream>
  9. #include <string.h>
  10. #include<queue>
  11. #include<cmath>
  12. using namespace std;
  13. const int M=5010,ME=5000000;
  14. const int INF=0x3f3fffff;
  15. //******************************
  16. int Head[M],Next[ME],Num[ME],Flow[ME],Cap[ME],Cost[ME],Q[M],InQ[M],Len[M],pre_edge[M];
  17. class MaxFlow
  18. {
  19. public:
  20. void clear()
  21. {
  22. memset(Head,-1,sizeof(Head));
  23. memset(Flow,0,sizeof(Flow));
  24. }
  25. void addedge(int u,int v,int cap,int cost)
  26. {
  27. Next[top] = Head[u];
  28. Num[top] = v;
  29. Cap[top] = cap;
  30. Cost[top] = cost;
  31. Head[u] = top++;
  32. Next[top] = Head[v];
  33. Num[top] = u;
  34. Cap[top] = 0;
  35. Cost[top] = -cost;
  36. Head[v] = top++;
  37. }
  38. int solve(int s,int t) //返回最终的cost
  39. {
  40. int cost = 0;
  41. while(SPFA(s,t))
  42. {
  43. int cur = t,minflow = INF;
  44. while(cur != s)
  45. {
  46. if(minflow > Cap[pre_edge[cur]]-Flow[pre_edge[cur]])
  47. minflow = Cap[pre_edge[cur]]-Flow[pre_edge[cur]];
  48. cur = Num[pre_edge[cur] ^ 1];
  49. }
  50. cur = t ;
  51. while(cur != s)
  52. {
  53. Flow[pre_edge[cur]] += minflow;
  54. Flow[pre_edge[cur] ^ 1] -= minflow;
  55. cost += minflow * Cost[pre_edge[cur]];
  56. cur = Num[pre_edge[cur] ^ 1];
  57. }
  58. }
  59. return cost;
  60. }
  61. private:
  62. bool SPFA(int s,int t)
  63. {
  64. fill(Len,Len+M,INF);
  65. Len[s]=0;
  66. int head = -1,tail = -1,cur;
  67. Q[++head] = s;
  68. while(head != tail)
  69. {
  70. ++tail;
  71. if(tail >= M) tail = 0 ;
  72. cur = Q[tail];
  73. for(int i = Head[cur];i != -1;i = Next[i])
  74. {
  75. if(Cap[i]>Flow[i] && Len[Num[i]] > Len[cur] + Cost[i])
  76. {
  77. Len[Num[i]] = Len[cur] + Cost[i];
  78. pre_edge[Num[i]] = i;
  79. if(!InQ[Num[i]])
  80. {
  81. InQ[Num[i]]=true;
  82. ++head;
  83. if(head >= M) head = 0;
  84. Q[head] = Num[i];
  85. }
  86. }
  87. }
  88. InQ[cur]=false;
  89. }
  90. return Len[t] != INF;
  91. }
  92. int top;
  93. }my;
  94. //******************************
  95. int need[55][55],canneed[55];
  96. int suply[55][55],cansuply[55];
  97. int trans[55][55][55];
  98. int main()
  99. {
  100. int n,m,k;
  101. while(scanf("%d%d%d",&n,&m,&k),n+m+k)
  102. {
  103. memset(canneed,0,sizeof(canneed));
  104. memset(cansuply,0,sizeof(cansuply));
  105. for(int i=1;i<=n;i++)
  106. {
  107. for(int j=1;j<=k;j++)
  108. {
  109. scanf("%d",&need[i][j]);
  110. canneed[j]+=need[i][j];// 第i个客户j商品的订货量
  111. }
  112. }
  113. for(int i=1;i<=m;i++)
  114. {
  115. for(int j=1;j<=k;j++)
  116. {
  117. scanf("%d",&suply[i][j]);
  118. cansuply[j]+=suply[i][j];//第i个仓库提供的j商品的量
  119. }
  120. }
  121. for(int i=1;i<=k;i++)
  122. {
  123. for(int j=1;j<=n;j++)
  124. {
  125. for(int f=1;f<=m;f++)
  126. {
  127. scanf("%d",&trans[i][j][f]);//把单位商品i从仓库f运到商户j所需的费用
  128. }
  129. }
  130. }
  131. int flag=1;
  132. for(int i=1;i<=k;i++)
  133. if(cansuply[i]<canneed[i])
  134. {
  135. flag=0;
  136. break;
  137. }
  138. if(!flag){puts("-1");continue;}
  139. int ans=0;
  140. for(int f=1;f<=k;f++)
  141. {
  142. my.clear();
  143. for(int i=1;i<=m;i++)
  144. {
  145. my.addedge(0,i,suply[i][f],0);
  146. for(int g=1;g<=n;g++)
  147. {
  148. my.addedge(i,m+g,suply[i][f],trans[f][g][i]);
  149. }
  150. }
  151. for(int i=1;i<=n;i++)
  152. {
  153. my.addedge(m+i,m+n+1,need[i][f],0);
  154. }
  155. ans+=my.solve(0,m+n+1);
  156. }
  157. printf("%d\n",ans);
  158. }
  159. return 0;
  160. }

poj 2516 最小费用最大流相关推荐

  1. poj 2516(最小费用最大流)

    其实题意很明确,最小费用最大流, 但是我这2货就建图就太二了, 我把所有的情况都弄到一个图里面. 总的点数有5000个,加上这么多的边,果断TLE... 后面知道第k个的情况是独立的,所以可以分成K次 ...

  2. POJ 2135 最小费用最大流

    思路: 源->1连费用0 流量2 其它的边 费用w 流量1 n->汇 费用0 流量2 最小费用流 搞定~ //By SiriusRen #include <queue> #in ...

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

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

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

    题目链接:点击查看 题目大意:给出n个买家,m个货点,以及k种货物,接下来按照顺序依次给出一个n*k的矩阵,表示每个买家对于每种货物的需求,一个m*k的矩阵,表示每个货点能供给货物的数量,k个n*m的 ...

  5. POJ 2135 Farm Tour (最小费用最大流)

    Description 给出一张\(N\)个点\(M\)条边的带权无向图,结点编号从\(1\)到\(N\),求从\(1\)到\(N\)再到\(1\)的最短路,每条边最多走一次. Input 第一行给出 ...

  6. POJ - 2175 Evacuation Plan(最小费用最大流+消圈定理)

    题目链接:点击查看 题目大意:给出n个建筑物和m个避难所,每个建筑物中的人需要到避难所中去避难,规定花费是建筑物和避难所的曼哈顿距离+1,现在给出一种路线方案,问这个方案是不是最优的,如果不是,输出比 ...

  7. POJ - 2135 Farm Tour(最小费用最大流)

    题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无向图,每条边都有权值,求点1->点n->点1的最短路,且要求每条路至多经过一次,并使得途径的权值和最小 题目分析:虽然题目要求 ...

  8. POJ - 2195 Going Home(二分图最小权匹配+KM+思维建边/最小费用最大流)

    题目链接:点击查看 题目大意:给出一个n*m的地图,现在有一定数量的小人要回到屋子里去,题目保证图中的小人和屋子的数量是一致的,小人回到小屋的距离是两个点坐标的曼哈顿距离,每个小屋只能容纳一个小人,现 ...

  9. POJ 2195 Going Home 最小费用最大流

    这题目同时也可以用KM()算法做,最求小权值匹配而已,权值设置为负数就行,具体KM算法参照:http://blog.csdn.net/cnh294141800/article/details/1895 ...

最新文章

  1. 在scrapy中parse函数里面xpath的内容打印不出来_Scrapy中 CrawlSpider 使用
  2. [概统]本科二年级 概率论与数理统计 第一讲 古典概型
  3. 【小白学PyTorch】5.torchvision预训练模型与数据集全览
  4. style 放入css文件失效_React中使用CSS的7种方式
  5. Linux 如何取进程运行时间,linux -- 获取进程执行时间
  6. 0009:err:listview:LISTVIEW_WindowProc unknown msg 108c问题解决
  7. leetcode1438. 绝对差不超过限制的最长连续子数组
  8. java转换ppt,ppt转成图片 乱码问题解决
  9. R12-表详解-总帐
  10. 【计算机组成与设计】3.4计算机CPU除法运算
  11. 敏捷模式下携程的接口自动化平台演变
  12. 程序员接私活完整攻略
  13. 计算机连接拒绝无法连接失败,打印机拒绝访问,教您打印机拒绝访问无法连接怎么解决...
  14. Linux下3种常用的网络测速工具简介
  15. 如何使用Python的第三方库you-get下载视频
  16. 电脑计算机简单密码设置方法,电脑开机密码怎么设置,开机密码设置很简单!
  17. 求解n个二进制数之间的最小码距
  18. 夜神模拟器换完本机的ip连不上忘 fiddler也抓不到模拟器的包
  19. 远程桌面全屏无法退出
  20. 谭宁计算机组装与维护,计算机组装与维护论文

热门文章

  1. 【计算机网络】传输层 : 总结 ( TCP / UDP 协议 | 寻址与端口 | UDP 协议 | TCP 协议特点 | TCP 连接释放 | TCP 流量控制 | TCP 拥塞控制 ) ★★★
  2. 【Android RTMP】音频数据采集编码 ( FAAC 音频编码参数设置 | FAAC 编码器创建 | 获取编码器参数 | 设置 AAC 编码规格 | 设置编码器输入输出参数 )
  3. 【Android 应用开发】分析各种Android设备屏幕分辨率与适配 - 使用大量真实安卓设备采集真实数据统计
  4. 【Android 应用开发】Android - TabHost 选项卡功能用法详解
  5. js获取浏览器宽度和高度值
  6. DevOps:软件架构师行动指南(文摘)
  7. selenium 浏览器driver地址
  8. Storm中并行度原来是这样计算的(1.0.1版本)
  9. Centos之压缩和解压缩命令
  10. 算法:两种步长的希尔排序算法