http://poj.org/problem?id=2391

floyd+网络流+二分

题意:有一个有向图,里面每个点有ai头牛,快下雨了牛要躲进雨棚里,每个点有bi个雨棚,每个雨棚只能躲1头牛。牛可以通过点之间的边移动来躲到其他的点的雨棚,路很宽一次可以走无数头牛,路的权是牛走过这条路要的时间。求最短需要多少时间所有牛都躲到雨棚下。

题解:

先floyd求出每个点到每个点的最短时间!然后二分答案,也就是二分牛躲完的时间,然后大于这个时间的路都封了,建个碉图,每个点分成两个点A和B,起点连接到所有的A,流量为牛数,所有的点B连接到终点,流量为棚数,一些A连接到一些B,流量为无限,代表牛的移动。二分+网络流,啪啪啪就过了。这是我做的第一个二分+网络流的题,好激动口牙!

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define ll long long
  5. using namespace std;
  6. const long long inf=0x7fffffffffffLL;
  7. const int MAXN=;
  8. long long a[MAXN][MAXN];
  9. long long b[MAXN][MAXN];
  10. long long d[MAXN][MAXN];
  11. int m,n;
  12. ll c[MAXN][MAXN];
  13. ll D[MAXN],h[MAXN],g[MAXN];
  14. bool found;
  15. ll augc,flow;
  16. int st,ed,N;
  17. ll sum;
  18.  
  19. void floyd()
  20. {
  21. int i,j,k;
  22. memcpy(d,b,sizeof(b));
  23. for(k=;k<=n;k++)
  24. for(i=;i<=n;i++)
  25. for(j=;j<=n;j++)
  26. if(d[i][k]+d[k][j]<d[i][j])
  27. d[i][j]=d[i][k]+d[k][j];
  28. }
  29.  
  30. void aug(const int m)
  31. {
  32. int i,augco=augc,mini,minh=N-;
  33. if (m==ed)//如果当前结点为汇点
  34. {
  35. found=true;
  36. flow+=augc; //增加流量
  37. return;
  38. }
  39. for (i=D[m]; i<=N; i++)//寻找容许边
  40. if (c[m][i]> && h[i]+==h[m])//如果残留容量大于0,如果是容许边
  41. {
  42. if (c[m][i]<augc) augc=c[m][i];//如果容许边流量小于当前增广路流量 则更新增广路流量
  43. D[m]=i; //把i定为当前弧
  44. aug(i); //递归
  45. if (h[]>=N) return; //GAP 如果源点距离标号大于n 则停止算法
  46. if (found) break; //如果找到汇点 则退出寻找
  47. augc=augco;//没找到就还原当前的流
  48. }
  49. if (!found) //重标号
  50. {
  51. for (i=; i<=N; i++) //找那个标号,这里不能用d[m]开始,不然会蛋疼
  52. if (c[m][i]> && h[i]<minh)
  53. {
  54. minh=h[i];
  55. mini=i;
  56. }
  57. g[h[m]]--; //GAP 距离为
  58. if (g[h[m]]==) h[]=N; //GAP
  59. h[m]=minh+;
  60. D[m]=mini;
  61. g[h[m]]++; //GAP
  62. }
  63. else
  64. {//修改残量
  65. c[m][i]-=augc;
  66. c[i][m]+=augc;
  67. }
  68. }
  69.  
  70. bool farm(ll time)
  71. {
  72. int i,j;
  73. //cout<<"farm"<<time<<endl;
  74. memcpy(c, a, sizeof(a));
  75. for(i=;i<=n;i++)
  76. for(j=;j<=n;j++)
  77. if(d[i][j]<=time) c[i+][j++n]=inf;
  78. else c[i+][j++n]=;
  79. N=ed;
  80. // for(i=1;i<=N;i++)
  81. // {
  82. // for(j=1;j<=N;j++)
  83. // cout<<c[i][j]<<' ';
  84. // cout<<endl;
  85. // }
  86. memset(h,,sizeof(h));
  87. memset(g,,sizeof(g));
  88. g[]=N;
  89. flow=;
  90. for(i=; i<=N; i++)
  91. D[i]=;//当前弧初始化
  92. while(h[]<N)
  93. {
  94. augc=inf;//初始化增广路容量为正无穷大
  95. found=false;
  96. aug();//从源点开始找
  97. }
  98. if(flow==sum) return true;
  99. else return false;
  100. }
  101.  
  102. int main()
  103. {
  104. int i,j,k;
  105. ll x,y,z;
  106. while(scanf("%d%d",&n,&m)!=EOF)
  107. {
  108. sum=;
  109. memset(a,,sizeof(a));
  110. st=;ed=n+n+;
  111. for(i=;i<=n+;i++)
  112. {
  113. scanf("%lld%lld",&x,&y);
  114. sum+=x;
  115. a[][i]+=x;
  116. a[i+n][ed]+=y;
  117. }
  118. for(i=;i<=n;i++)
  119. for(j=;j<=n;j++)
  120. b[i][j]=inf;
  121. for(i=;i<=n;i++)
  122. b[i][i]=;
  123. for(i=;i<=m;i++)
  124. {
  125. scanf("%lld%lld%lld",&x,&y,&z);
  126. b[x][y]=min(b[x][y],z);
  127. b[y][x]=b[x][y];
  128. }
  129. floyd();
  130. ll l=inf,r=-;
  131. for(i=;i<=n;i++)
  132. for(j=;j<=n;j++)
  133. {
  134. l=min(l,d[i][j]);
  135. r=max(r,d[i][j]);
  136. }
  137. r=min(inf-,r);
  138. if (!farm(r))
  139. {
  140. printf("-1\n");
  141. continue;
  142. }
  143. ll mid=(l+r)/,pl=-,pr=-;
  144. while(l!=pl || r!=pr)
  145. {
  146. pl=l;pr=r;
  147. if(farm(mid)) r=mid;
  148. else l=mid;
  149. mid=(l+r)/;
  150. //cout<<l<<','<<r<<','<<mid<<endl;
  151. }
  152. printf("%lld\n",r);
  153. }
  154. return ;
  155. }

poj2391 Ombrophobic Bovines 题解的更多相关文章

  1. poj2391 Ombrophobic Bovines 拆点+二分法+最大流

    /** 题目:poj2391 Ombrophobic Bovines 链接:http://poj.org/problem?id=2391 题意:有n块区域,第i块区域有ai头奶牛,以及一个可以容纳bi ...

  2. POJ2391 Ombrophobic Bovines(网络流)(拆点)

                         Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  3. POJ2391 Ombrophobic Bovines

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19359   Accepted: 4 ...

  4. POJ2391 Ombrophobic Bovines 网络流拆点+二分+floyed

    题目链接: id=2391">poj2391 题意: 有n块草地,每块草地上有一定数量的奶牛和一个雨棚,并给出了每一个雨棚的容(牛)量. 有m条路径连接这些草地  ,这些路径是双向的, ...

  5. POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)

    Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 21660Accepted: 4658 题目 ...

  6. BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )

    一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...

  7. poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap

    poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...

  8. POJ 2391 Ombrophobic Bovines

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 4 ...

  9. poj 2391 Ombrophobic Bovines(最大流+floyd+二分)

    Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 14519Accepted: 3170 De ...

随机推荐

  1. macOS 安装 pip

    安装好wget之后: wget https://bootstrap.pypa.io/get-pip.py sudo python get-pip.py 终于可以愉快的pip了~

  2. SVN分支研究

    在结合之前总结的定制开发的产品版本开发问题解决的方法:http://www.cnblogs.com/EasonJim/p/5971906.html,今天来研究以下用SVN处理这类的问题. 研究SVN分 ...

  3. IIS如何设置可以让.aspx后缀的文件直接下载

    修改配置文件:<system.webServer> <staticContent> <remove fileExtension=".aspx" /&g ...

  4. 新建的SQL Server账号无法使用跟踪功能

    如题,出现了如下图所示: 在IDE中,死活找不到哪里可以设置,最终发现,这功能只能用语句实现: GRANT ALTER TRACE TO 用户名 搞定,特此记录一下.

  5. Circular Queue Implementation Principle

    目录 . 引言 . 环形队列的实现原理 . 环形队列编程实现 . 环形队列的内核实现 1. 引言 环形队列是在实际编程极为有用的数据结构,它有如下特点 . 它是一个首尾相连的FIFO(First In ...

  6. [iOS UI设计笔记整理汇总]

    8.UIsearchbar放到Navigationbar 上(意思是建个View作为titleview) //此处调用的是第三方封装的SearchBar,也可以自定义. self.searchBarW ...

  7. InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集

    友元程序集简介 我们知道一个类中被定义为internal的成员(包括类型.方法.属性.变量.事件)是只能在同一个程序集中被访问到的(当然了,我这里说的是正常的方式,不包括通过反射来访问).这个规则在. ...

  8. A.Kaw矩阵代数初步学习笔记 8. Gauss-Seidel Method

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  9. A.Kaw矩阵代数初步学习笔记 6. Gaussian Elimination

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  10. BCE0019: '' is not a member of 'UnityEngine.Component'的问题

    看自学网上的Unity3D的视频,其中视频中的实力代码: n.rigidbody.AddForce(fwd * 28000); 这个代码运行会出现错误: BCE0144: 'UnityEngine.C ...