nx一个挤奶器,ny奶牛,每个挤奶罐为最m奶牛使用。

现在给nx+ny在矩阵之间的距离。要求使所有奶牛挤奶到挤奶正在旅程,最小的个体奶牛步行距离的最大值。

始感觉这个类似二分图匹配,不同之处在于挤奶器能够连接m个以内的奶牛,用网络流的模型是能够求出满足条件的解的。

问题是怎样满足最大路程的最小值,这一种典型的二分的问法。。

所以我们二分答案,也就是枚举最大路程,直到求得最小值。

每次建边既加入全部最大路程以内的边,加入源点向每一个挤奶器建边。容量为m。其它边都是1,

若返回的最大流是ny则该枚举值能够达到。

这题由于二分上界wa的是由于 有些点之间開始不直接连通,求了floyd之后联通了且边权>200

  1. #include <iostream>
  2. #include <cstring>
  3. #include <string>
  4. #include <cstdio>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <queue>
  9. #include <map>
  10. #define inf 0x3f3f3f3f
  11. #define eps 1e-6
  12. #define ll __int64
  13. const int maxn=300;
  14. using namespace std;
  15.  
  16. int n,s,t,level[maxn],c[maxn][maxn];
  17. int m,nx,ny,dis[maxn][maxn];
  18.  
  19. bool makelevel()
  20. {
  21. memset(level,0,sizeof level);
  22. level[s]=1;
  23. int q[maxn];
  24. int fro=0,iq=0;
  25. q[iq++]=s;
  26. int i,v;
  27. while(fro!=iq)
  28. {
  29. v=q[fro++];
  30. for(i=0;i<=n+1;i++)//注意点的编号
  31. {
  32. if(!level[i]&&c[v][i])
  33. {
  34. level[i]=level[v]+1;
  35. q[iq++]=i;
  36. }
  37. }
  38. }
  39. if(!level[t]) return 0;
  40. return 1;
  41. }
  42.  
  43. int dfs(int now,int maxf)
  44. {
  45. if(now==t) return maxf;
  46. int ret=0;
  47. for(int i=0;maxf&&i<=n+1;i++)//注意点的编号
  48. {
  49. if(c[now][i]&&level[now]+1==level[i])
  50. {
  51. int tmp=dfs(i,min(maxf,c[now][i]));
  52. c[now][i]-=tmp;
  53. c[i][now]+=tmp;
  54. ret+=tmp;
  55. maxf-=tmp;
  56. }
  57. }
  58. return ret;
  59. }
  60.  
  61. int dinic(int d)
  62. {
  63. int i,j;
  64. memset(c,0,sizeof c);
  65. for(i=1;i<=nx;i++)
  66. {
  67. c[s][i]=m;
  68. for(j=nx+1;j<=n;j++)
  69. {
  70. c[j][t]=1;
  71. if(dis[i][j]<=d) c[i][j]=1;
  72. }
  73. }
  74. int ans=0;
  75. while(makelevel()) ans+=dfs(s,inf);
  76. return ans;
  77. }
  78.  
  79. int main()
  80. {
  81. int a,mmax,ri,le,mid,i,j,k;
  82. while(~scanf("%d%d%d",&nx,&ny,&m))
  83. {
  84. mmax=0;
  85. n=nx+ny;
  86. s=0;t=n+1;
  87. for(i=1;i<=n;i++)
  88. for(j=1;j<=n;j++)
  89. {
  90. scanf("%d",&a);
  91. if(j>nx&&i<=nx) mmax=max(mmax,a);
  92. dis[i][j]=(a==0?inf:a);
  93. }
  94. for(k=1;k<=n;k++)
  95. for(i=1;i<=n;i++)
  96. for(j=1;j<=n;j++)
  97. {
  98. if(i!=j&&dis[i][j]>dis[i][k]+dis[k][j])
  99. dis[i][j]=dis[i][k]+dis[k][j];
  100. }
  101. ri=10000;
  102. le=0;
  103. while(le<ri)
  104. {
  105. mid=(le+ri)/2;
  106. if(dinic(mid)>=ny)
  107. ri=mid;
  108. else le=mid+1;
  109. }
  110. printf("%d\n",ri);
  111. }
  112. return 0;
  113. }

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

poj2112 Optimal Milking --- 最大流量,二分法的更多相关文章

  1. POJ2112 Optimal Milking —— 二分图多重匹配/最大流 + 二分

    题目链接:https://vjudge.net/problem/POJ-2112 Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K T ...

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

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

  3. POJ2112 Optimal Milking

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 17811   Accepted: 6368 ...

  4. POJ2112 Optimal Milking 【最大流+二分】

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12482   Accepted: 4508 ...

  5. [USACO2003][poj2112]Optimal Milking(floyd+二分+二分图多重匹配)

    http://poj.org/problem?id=2112 题意: 有K个挤奶器,C头奶牛,每个挤奶器最多能给M头奶牛挤奶. 每个挤奶器和奶牛之间都有一定距离. 求使C头奶牛头奶牛需要走的路程的最大 ...

  6. POJ2112 Optimal Milking(最大流)

    先Floyd求牛到机器最短距离,然后二分枚举最长的边. #include<cstdio> #include<cstring> #include<queue> #in ...

  7. POJ-2112 Optimal Milking(floyd+最大流+二分)

    题目大意: 有k个挤奶器,在牧场里有c头奶牛,每个挤奶器可以满足m个奶牛,奶牛和挤奶器都可以看成是实体,现在给出两个实体之间的距离,如果没有路径相连,则为0,现在问你在所有方案里面,这c头奶牛需要走的 ...

  8. POJ2112:Optimal Milking(Floyd+二分图多重匹配+二分)

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 20262   Accepted: 7230 ...

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

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

随机推荐

  1. hdu1881(贪心+dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1881 分析:按照结束时间从小到大排序,然后以每个结束点为容量进行01背包,选入的必定符合条件的. 因为 ...

  2. Linux Shell脚本入门--grep命令详解

    grep简介<摘自鸟哥,并加以整理.> grep (global search regular expression(RE) and print out the line,全面搜索正则表达 ...

  3. 使用AndroidFrameworks开发和应用隐藏类 or Android使用自定义framework开发与应用

    Android眼下代表系统的开源手机操作系统已经更新到4.0.3版本号.由于其开源特性.使得操作系统本身所具有的最大的灵活性,但同时也引起的版本号的多样性,市场上出现的是手机厂商或ROM.可是怎样开发 ...

  4. CH BR4思考熊(恒等有理式-逆波兰表达式求值)

    恒等有理式 总时限 10s 内存限制 256MB 出题人 fotile96 提交情况 4/43 描述 给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f ...

  5. 啊我V办我偶看篇未改片考i

    http://pan.baidu.com/share/link?shareid=3011665141&uk=338692646&third=15                http ...

  6. SVN 的revert操作

  7. 【SSH 基础】浅谈Hibernate关系映射(4)

    继上篇博客 多对多关联映射(单向) 多对多对象关系映射,须要增加一张新表完毕基本映射. Hibernate会自己主动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多 ...

  8. 在自己的base脚本中实现自动补全

    在90年代Linux和DOS共存的年代里,Linux的Shell们有一个最微不足道但也最实用的小功能,就是命令自动补全.而DOS那个笨蛋一直到死都没学会什么叫易用. Linux的这个微不足道的小传统一 ...

  9. 实现Timeline

    Redis实现Timeline 上回写了使用Redis实现关注关系,这次说说使用Redis实现Timeline. Timeline的实现一般有推模式.拉模式.推拉结合这几种.推模式:某人发布内容之后推 ...

  10. html学习 - 自己主动跳转与自己主动刷新

    自己主动刷新 事实上自己主动刷新和跳转没啥差别,刷新就是跳转到本地址. 有几种办法,首先是直接在html的<head>标签里加入以下的代码. html代码 代码都放在<head> ...