Optimal Milking

题目:

有K个机器。C仅仅牛。要求求出最全部牛到各个产奶机的最短距离。给出一个C+K的矩阵,表示各种标号间的距离。

而每一个地方最多有M仅仅牛。

算法分析:

二分+最短路+网络流

想法难以想到。我是看解题报告的思路。

然后。自己上了手。開始wrong 了3次。后来各种该。无意的一个更改就AC了。无语勒。

。。。

wrong 在了,网络流建图的时候仅仅能是机器和奶牛之间的距离关系。而奶牛跟奶牛或者机器跟机器不要建边。当时脑残了。!。!

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <queue>
  5. #include <cstdio>
  6. #include <cstring>
  7. using namespace std;
  8.  
  9. const int INF = 1 << 20;
  10. const int MAXN = 1000;
  11.  
  12. struct Edge{
  13. int from,to,cap,flow,cost;
  14. Edge(){};
  15. Edge(int _from,int _to,int _cap,int _flow)
  16. :from(_from),to(_to),cap(_cap),flow(_flow){};
  17. };
  18. vector<Edge> edges;
  19. vector<int> G[MAXN];
  20. int cur[MAXN],d[MAXN];
  21. bool vst[MAXN];
  22. int src,sink;
  23. int dist[MAXN][MAXN];
  24. int K,C,M,V;
  25.  
  26. void init(){
  27. src = V + 1; sink = src + 1;
  28. for(int i = 0;i <= sink;++i)
  29. G[i].clear();
  30. edges.clear();
  31. }
  32.  
  33. void flody(){
  34. for(int k = 0;k < V;++k)
  35. for(int i = 0;i < V;++i)
  36. for(int j = 0;j < V;++j)
  37. if(dist[i][j] > dist[i][k] + dist[k][j])
  38. dist[i][j] = dist[i][k] + dist[k][j];
  39. // for(int i = 0;i < V;++i){
  40. // for(int j = 0;j < V;++j)
  41. // printf("%d ",dist[i][j]);
  42. // puts("");
  43. // }
  44. }
  45.  
  46. void addEdge(int from,int to,int cap){
  47. edges.push_back(Edge(from,to,cap,0));
  48. edges.push_back(Edge(to,from,0,0));
  49. int sz = edges.size();
  50. G[from].push_back(sz - 2);
  51. G[to].push_back(sz - 1);
  52. }
  53.  
  54. void build(int limit){
  55. init();
  56.  
  57. for(int i = K;i < V;++i){ // 奶牛与源点
  58. addEdge(src,i,1);
  59. }
  60.  
  61. for(int i = 0;i < K;++i){ //机器与汇点
  62. addEdge(i,sink,M);
  63. }
  64.  
  65. //注意---> i = K!!! j < K!!!!
  66. for(int i = K;i < V;++i){ //奶牛与机器的连接
  67. for(int j = 0;j < K;++j){
  68. if(dist[i][j] <= limit){
  69. addEdge(i,j,1);
  70. }
  71. }
  72. }
  73.  
  74. }
  75.  
  76. bool BFS(){
  77. memset(vst,0,sizeof(vst));
  78. queue<int> Q;
  79. Q.push(src);
  80. d[src] = 0;
  81. vst[src] = 1;
  82.  
  83. while(!Q.empty()){
  84. int x = Q.front(); Q.pop();
  85. for(int i = 0;i < (int)G[x].size();++i){
  86. Edge& e = edges[G[x][i]];
  87. if(!vst[e.to] && e.cap > e.flow){
  88. vst[e.to] = 1;
  89. d[e.to] = d[x] + 1;
  90. Q.push(e.to);
  91. }
  92. }
  93. }
  94.  
  95. return vst[sink];
  96. }
  97.  
  98. int DFS(int x,int a){
  99. if(x == sink||a == 0)
  100. return a;
  101.  
  102. int flow = 0,f;
  103. for(int& i = cur[x];i < (int)G[x].size();++i){
  104. Edge& e = edges[G[x][i]];
  105. if(d[e.to] == d[x] + 1&&(f = DFS(e.to,min(a,e.cap - e.flow))) > 0){
  106. e.flow += f;
  107. edges[G[x][i]^1].flow -= f;
  108. flow += f;
  109. a -= f;
  110. if(a == 0) break;
  111. }
  112. }
  113. return flow;
  114. }
  115.  
  116. int maxFlow(){
  117. int flow = 0;
  118. while(BFS()){
  119. memset(cur,0,sizeof(cur));
  120. flow += DFS(src,INF);
  121. }
  122. return flow;
  123. }
  124.  
  125. bool Check(int mid){
  126. build(mid);
  127. int flow = maxFlow(); //cout << "flow : " << flow << endl;
  128.  
  129. return flow == C;
  130. }
  131.  
  132. void solve(){
  133. flody();
  134.  
  135. int lb = -1,ub = INF + 100;
  136. while(ub - lb > 1){
  137. int mid = (lb + ub) / 2;
  138. if(Check(mid))
  139. ub = mid;
  140. else
  141. lb = mid;
  142.  
  143. //cout << "mid: " << mid << " lb: " << lb << " ub: " << ub << endl;
  144. }
  145.  
  146. printf("%d\n",ub);
  147. }
  148.  
  149. int main()
  150. {
  151. // freopen("Input.txt","r",stdin);
  152.  
  153. while(~scanf("%d%d%d",&K,&C,&M)){
  154. V = K + C;
  155. int x;
  156. for(int i = 0;i < V;++i){
  157. for(int j = 0;j < V;++j){
  158. scanf("%d",&x);
  159. dist[i][j] = (x == 0 ? INF : x);
  160. }
  161. dist[i][i] = 0;
  162. }
  163.  
  164. solve();
  165. }
  166. return 0;
  167. }

另一种是多个匹配,。没有写。成品填充。

版权声明:本文博主原创文章,博客,未经同意不得转载。

poj Optimal Milking的更多相关文章

  1. POJ 2112 Optimal Milking (二分+最短路径+网络流)

    POJ  2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K To ...

  2. POJ 2112 Optimal Milking (二分 + floyd + 网络流)

    POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C ...

  3. POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】

    Optimal Milking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Sub ...

  4. Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)

    题目链接: Poj 2112 Optimal Milking 题目描述: 有k个挤奶机,c头牛,每台挤奶机每天最多可以给m头奶牛挤奶.挤奶机编号从1到k,奶牛编号从k+1到k+c,给出(k+c)*(k ...

  5. Optimal Milking 分类: 图论 POJ 最短路 查找 2015-08-10 10:38 3人阅读 评论(0) 收藏

    Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 13968 Accepted: 5044 Case ...

  6. POJ 2112 Optimal Milking (Dinic + Floyd + 二分)

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 19456   Accepted: 6947 ...

  7. Optimal Milking POJ - 2112 (多重最优匹配+最小费用最大流+最大值最小化 + Floyd)

      Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 19347   Accepted: 690 ...

  8. POJ2112 Optimal Milking (网络流)(Dinic)

                                             Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K T ...

  9. 题解 最优的挤奶方案(Optimal Milking)

    最优的挤奶方案(Optimal Milking) 时间限制: 1 Sec  内存限制: 128 MB 题目描述 农场主 John 将他的 K(1≤K≤30)个挤奶器运到牧场,在那里有 C(1≤C≤20 ...

随机推荐

  1. rsync Backups for Windows

    Transfer your Windows Backups to an rsync server over SSH rsync.net provides cloud storage for offsi ...

  2. 【ASP.NET Web API教程】5.3 发送HTML表单数据:文件上传与多部分MIME

    原文:[ASP.NET Web API教程]5.3 发送HTML表单数据:文件上传与多部分MIME 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面 ...

  3. 【ASP.NET Web API教程】6 格式化与模型绑定

    原文:[ASP.NET Web API教程]6 格式化与模型绑定 6 Formats and Model Binding 6 格式化与模型绑定 本文引自:http://www.asp.net/web- ...

  4. java面向对象下:JavaXML解析技术

    20.JavaXML解析技术: XML概述:        XML可扩展标记性语言,用于数据表达和数据传递. XML语法规则:        合法DTDXML:1.内部DTD(和XML一起):2.外部 ...

  5. Linux Shell 之 Shell中的函数调用

    说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总 ...

  6. Delphi调用C++导出的QT类

    打开VS2008创建一个dll项目(创建了一个QT Library项目),新建头文件q4dapplication.h定义纯虚类: #ifndef Q4DAPPLICATION#define Q4DAP ...

  7. 百度GPSutil

    ================================================= package com.qcar.benz.biz.common; import com.aliba ...

  8. 阿录帮帮忙—spring mvc 的hello world

    一:web.xml配置 <!-- Spring MVC配置 --> <servlet> <servlet-name>Spring MVC Dispatcher Se ...

  9. 呜呼!Node.js是什么?

    近期看到非常多站点都使用node.js.開始感到非常好奇.就開始推測这是个什么东西,大概就是个js文件吧,所以開始根本 没有在意,可是越感觉就认为越不正确劲,为什么大家都在用它呢?所以我决定搞个明确. ...

  10. 高逼格UI-ASD(Android Support Design)

    绪 今年的Google IO给我们android开发着带来了三样非常屌非常屌的library: ASD(Android Support Design) APL(Android Percent Layo ...