题意:在一图中,每个点有俩个属性:现在牛的数量和雨棚大小(下雨时能容纳牛的数量),每个点之间有距离,

给出牛(速度一样)在顶点之间移动所需时间,问最少时间内所有牛都能避雨。

模型分析:多源点去多汇点(此题源点也可能是汇点(源汇同点)),所以我的方法是:建立超级源点和超级

汇点,超级源点连想所有点,容量为该店本来的牛数量,在把各点拆成如图(略丑),到汇点的容量分别为

避雨容纳量,点点之间容量可以无限大。folyd求任意两点的最短路后,二分最大时间建图,枚举求最大之最小即可。

未1A原因:

1:开始时为了偷取一点时间复杂度,源点和汇点的部分图按全局先建立了,导致链式前向星操作失控,

也因为这样更好的理解了head[i]的作用;

2:开始没有拆点,这题明显和POJ2112不同,因为目标点(多个)和出发点(多个)可能在同一个点,

必需拆点i  --》i+n+1(n+1是超级汇点)。

3.注意此题数据范围,一条边可能到10^10,多边时必然爆INT,用longlong,在函数传参的时候也别忘记!

还有就是几条边,200*200*2+200*2*2(200个点拆后俩俩有双向边+超级源点和汇点)。

PS:为什么我的dinic时间要700MS+。。。。

  1. #include<iostream>//750MS
  2. #include<cstdio>
  3. #include<vector>
  4. #include<queue>
  5. using namespace std;
  6. int n,m;const int inf =0x3f3f3f3f;
  7. long long a[210][210]; long long minmax=0;int num=0;
  8. int sh=0; int numcow=0;
  9. int e[81001][3];int head[410]; int cow[210];int shelt[210]; //链式前向星二维数组表示法,0:to,1:pre,2:wight;
  10. void folyd() //最短路不用说
  11. {
  12. for(int i=1;i<=n;i++)
  13. for(int j=1;j<=n;j++)
  14. for(int ii=1;ii<=n;ii++)
  15. if(a[j][ii]>a[j][i]+a[i][ii])
  16. {
  17. a[j][ii]=a[j][i]+a[i][ii];
  18. if(a[j][ii]>minmax)minmax=a[j][ii]; //枚举上界
  19. }
  20. }
  21. void build(long long limit) //建图
  22. {
  23. num=0;
  24. for(int i=0;i<=2*n+2;i++)
  25. head[i]=-1;
  26. for(int i=1;i<=n;i++) //超级源点和汇点
  27. {
  28. e[num][0]=i;e[num][1]=head[0];head[0]=num;
  29. e[num++][2]=cow[i];
  30. e[num][0]=0;e[num][1]=head[i];head[i]=num;
  31. e[num++][2]=0;
  32. e[num][0]=n+1;e[num][1]=head[i+n+1];head[i+n+1]=num;
  33. e[num++][2]=shelt[i];
  34. e[num][0]=i+n+1;e[num][1]=head[n+1];head[n+1]=num;
  35. e[num++][2]=0;
  36. }
  37. for(int i=1;i<=n;i++) //限制下可以添加的边
  38. for(int j=1;j<=n;j++)
  39. if(a[i][j]<=limit)
  40. {
  41. e[num][0]=j+n+1;e[num][1]=head[i];head[i]=num;
  42. e[num++][2]=numcow;
  43. e[num][0]=i;e[num][1]=head[j+n+1];head[j+n+1]=num;
  44. e[num++][2]=0;
  45. }
  46. }
  47. int level[410];int vis[410];
  48. bool bfs() //bfs+dfs,dinic算法
  49. {
  50. for(int i=0;i<=2*n+2;i++)
  51. vis[i]=level[i]=0;
  52. queue<int>q;
  53. q.push(0);vis[0]=1;
  54. while(!q.empty())
  55. {
  56. int cur=q.front();q.pop();
  57. for(int i=head[cur];i!=-1;i=e[i][1])
  58. { int to=e[i][0];
  59. if(!vis[to]&&e[i][2]>0)
  60. {
  61. vis[to]=1;
  62. level[to]=level[cur]+1;
  63. if(to==n+1)return 1;
  64. q.push(to);
  65. }
  66. }
  67. }
  68. return vis[n+1];
  69. }
  70. int dfs(int uu,int minf)
  71. {
  72. if(uu==n+1||minf==0)return minf;
  73. int sum=0,f;
  74. for(int i=head[uu];i!=-1&&minf;i=e[i][1])
  75. { int to=e[i][0];
  76. if(level[to]==level[uu]+1&&e[i][2]>0)
  77. {
  78. f=dfs(to,minf<e[i][2]?minf:e[i][2]);
  79. e[i][2]-=f;e[i^1][2]+=f;
  80. sum+=f;minf-=f;
  81. }
  82. }
  83. return sum;
  84. }
  85. bool check(long long limit)
  86. {
  87. build(limit);
  88. int sumflow=0;
  89. while(bfs())
  90. {
  91. sumflow+=dfs(0,inf);
  92. }
  93. if(sumflow==numcow)
  94. return 1;
  95. return 0;
  96. }
  97. int main()
  98. {
  99. scanf("%d%d",&n,&m);
  100. for(int i=1;i<=n;i++)
  101. {
  102. scanf("%d%d",&cow[i],&shelt[i]);
  103. numcow+=cow[i]; sh+=shelt[i];
  104. }
  105. for(int i=0;i<=n;i++)
  106. for(int j=0;j<=n;j++)
  107. a[i][j]=10000000000000;
  108. for(int i=0;i<=n;i++)
  109. a[i][i]=0;
  110. for(int j=1;j<=m;j++)
  111. {
  112. int temp1,temp2;
  113. scanf("%d%d",&temp1,&temp2);
  114. long long tempa;
  115. scanf("%lld",&tempa);
  116. if(a[temp1][temp2]>tempa)
  117. {
  118. a[temp1][temp2]=tempa;
  119. a[temp2][temp1]=tempa;
  120. if(a[temp1][temp2]>minmax)minmax=a[temp1][temp2]; //枚举上界
  121. }
  122. }
  123. if(numcow>sh){printf("-1\n");return 0;} //无解情况
  124. folyd();
  125. long long left=0,right=minmax,mid;
  126. if(!check(minmax)){printf("-1\n");return 0;} //无解情况
  127. while(right>left+1) //二分答案,注意一下
  128. {
  129. mid=(right+left)/2;
  130. if(check(mid))
  131. {
  132. right=mid;
  133. }
  134. else
  135. left=mid;
  136. }
  137. if(check(right-1)) //最后二分时判断特殊情况
  138. printf("%lld\n",right-1);
  139. else
  140. printf("%lld\n",right);
  141. return 0;
  142. }

POJ 2391 多源多汇拆点最大流 +flody+二分答案的更多相关文章

  1. POJ 3273-Monthly Expense 求分组和的最小的最大值【二分答案】

    题目链接:http://poj.org/problem?id=3273 题目大意:给出一个有n个数据的数组,将其分为连续的m份,找到一种分法,是的m份中最大一份总和最小 解题思路: 直接在答案的区间内 ...

  2. poj 1698 Alice&#39;s Chance 拆点最大流

    将星期拆点,符合条件的连边,最后统计汇点流量是否满即可了,注意结点编号. #include<cstdio> #include<cstring> #include<cmat ...

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

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

  4. POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)

    [题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...

  5. 2018.07.06 POJ 1459 Power Network(多源多汇最大流)

    Power Network Time Limit: 2000MS Memory Limit: 32768K Description A power network consists of nodes ...

  6. POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)

    题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...

  7. POJ 2391 floyd二分+拆点+最大流

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

  8. POJ 2391 容牛问题

    题目大意:给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T使得在T时间内所有的牛都能进到某一牛棚里去.(1 <= N <= 200, 1 <= M &l ...

  9. poj1459 Power Network (多源多汇最大流)

    Description A power network consists of nodes (power stations, consumers and dispatchers) connected ...

随机推荐

  1. vue同胞组件通讯解决方案(以下为一种另外可用vuex解决)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. Android中单选框RadioButton的基本用法

    总结一下设置图标的三种方式: (1)button属性:主要用于图标大小要求不高,间隔要求也不高的场合. (2)background属性:主要用于能够以较大空间显示图标的场合. (3)drawableL ...

  3. 因JQUERY版本而产生的问题,需要加上迁移文件

    IMG_01_history控制台报错 IMG_02_history代码报错

  4. hql语法002

    1. package cn.jbit.hibernatedemo.test; import java.util.Iterator; import java.util.List; import org. ...

  5. environ - 用户环境(变量)

    SYNOPSIS 总览 extern char **environ; DESCRIPTION 描述 变量 environ 指向的是一个叫 'environment'(环境)的字符串数组 (这个变量必须 ...

  6. 微信小程序---代码构成

    通过开发者工具快速创建了一个demo项目,观察后可以发现这个项目里边生成了不同类型的文件: .json 后缀的 JSON 配置文件 .wxml 后缀的 WXML 模板文件 .wxss 后缀的 WXSS ...

  7. Eclipse的PyDev插件安装及解决安装后找不到的问题

    一.环境 windows 7 64bit eclipse 4.5.2 pydev jdk7u55 二.安装步骤 1. 安装JDK eclipse依赖于Java环境,所以需要安装Java运行环境JRE. ...

  8. luogu 1968 美元汇率

    https://www.luogu.org/problemnew/show/P1968 定义二维数组f[ ][ ],f[i][1]表示在第i天将马克变为美元,f[i][2]表示在第i天将美元变为马克. ...

  9. Django中对接第三方支付(支付宝)实现支付的流程

    1. 业务逻辑准备 1. 使用沙箱提供的商家环境 沙箱环境:是支付宝提供给开发者的模拟支付的环境 沙箱应用:https://docs.open.alipay.com/200/105311 沙箱账号:h ...

  10. 自定义函数导致的sql性能问题

    同事说,某某报表跑的很慢,让我调查一下 优化前:该报表整体需要跑4小时以上. sql代码如下 SELECT /*省略多数查询字段*/ REP_FUN_REFCODEVALUE /*自定义函数*/ (P ...