题目地址:POJ3288

这个题跟之前的一道题混了,感觉是一样的,所以连想都没怎么想就拆点然后求最短路然后二分求最大流了。结果连例子都只是,还一直以为又是哪里手残了。。结果看了看例子,手算也确实不正确,,。后来就没拆点,直接在原点上建的图,结果例子就过了。。然后提交1次AC。。。

后来细致的想了想,这题是问每一段路的最短的,而不是整个的最短的。所以说不应该拆点。而我混的那道题(poj2391)是问的走完的总的最小值。

这题的建图就是建一源点与汇点,将每一个金矿与源点相连,权值为金矿数,与汇点也相连,权值为仓库容量。然后二分最大距离,小于二分到的距离的连边。最后推断是否满流。

代码例如以下:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <ctype.h>
  7. #include <queue>
  8. #include <map>
  9. #include <algorithm>
  10.  
  11. using namespace std;
  12. const int INF=1e9;
  13. int head[500], s, t, nv, cnt, sum;
  14. int num[500], d[500], pre[500], cur[500], q[500], g1[500], g2[500], mp[210][210];
  15. struct node
  16. {
  17. int u, v, cap, next;
  18. }edge[1000000];
  19. void add(int u, int v, int cap)
  20. {
  21. edge[cnt].v=v;
  22. edge[cnt].cap=cap;
  23. edge[cnt].next=head[u];
  24. head[u]=cnt++;
  25.  
  26. edge[cnt].v=u;
  27. edge[cnt].cap=cap;
  28. edge[cnt].next=head[v];
  29. head[v]=cnt++;
  30. }
  31. void bfs()
  32. {
  33. memset(d,-1,sizeof(d));
  34. memset(num,0,sizeof(num));
  35. int f1=0, f2=0, i;
  36. q[f1++]=t;
  37. num[0]=1;
  38. d[t]=0;
  39. while(f1>=f2)
  40. {
  41. int u=q[f2++];
  42. for(i=head[u];i!=-1;i=edge[i].next)
  43. {
  44. int v=edge[i].v;
  45. if(d[v]==-1)
  46. {
  47. d[v]=d[u]+1;
  48. num[d[v]]++;
  49. q[f1++]=v;
  50. }
  51. }
  52. }
  53. }
  54. int isap()
  55. {
  56. memcpy(cur,head,sizeof(cur));
  57. int flow=0, u=pre[s]=s, i;
  58. bfs();
  59. while(d[s]<nv)
  60. {
  61. if(u==t)
  62. {
  63. int f=INF, pos;
  64. for(i=s;i!=t;i=edge[cur[i]].v)
  65. {
  66. if(f>edge[cur[i]].cap)
  67. {
  68. f=edge[cur[i]].cap;
  69. pos=i;
  70. }
  71. }
  72. for(i=s;i!=t;i=edge[cur[i]].v)
  73. {
  74. edge[cur[i]].cap-=f;
  75. edge[cur[i]^1].cap+=f;
  76. }
  77. flow+=f;
  78. if(flow>=sum)
  79. return flow;
  80. u=pos;
  81. }
  82. for(i=cur[u];i!=-1;i=edge[i].next)
  83. {
  84. if(d[edge[i].v]+1==d[u]&&edge[i].cap)
  85. {
  86. break;
  87. }
  88. }
  89. if(i!=-1)
  90. {
  91. cur[u]=i;
  92. pre[edge[i].v]=u;
  93. u=edge[i].v;
  94. }
  95. else
  96. {
  97. if(--num[d[u]]==0) break;
  98. int mind=nv;
  99. for(i=head[u];i!=-1;i=edge[i].next)
  100. {
  101. if(mind>d[edge[i].v]&&edge[i].cap)
  102. {
  103. mind=d[edge[i].v];
  104. cur[u]=i;
  105. }
  106. }
  107. d[u]=mind+1;
  108. num[d[u]]++;
  109. u=pre[u];
  110. }
  111. }
  112. return flow;
  113. }
  114. int main()
  115. {
  116. int n, m, a, b, c, i, j, x, y;
  117. while(scanf("%d",&n)!=EOF&&n)
  118. {
  119. sum=0;
  120. y=0;
  121. for(i=1;i<=n;i++)
  122. {
  123. scanf("%d",&g1[i]);
  124. sum+=g1[i];
  125. }
  126. for(i=1;i<=n;i++)
  127. {
  128. scanf("%d",&g2[i]);
  129. y+=g2[i];
  130. }
  131. scanf("%d",&m);
  132. memset(mp,9999999,sizeof(mp));
  133. while(m--)
  134. {
  135. scanf("%d%d%d",&a,&b,&c);
  136. if(mp[a][b]>c)
  137. mp[a][b]=mp[b][a]=c;
  138. }
  139. /*for(i=1;i<=n;i++)
  140. {
  141. for(j=1;j<=n;j++)
  142. {
  143. printf("%d ",mp[i][j]);
  144. }
  145. printf("\n");
  146. }*/
  147. if(y<sum)
  148. {
  149. printf("No Solution\n");
  150. continue ;
  151. }
  152. int high=2000000, mid, low=1, ans=-1;
  153. while(low<=high)
  154. {
  155. mid=(low+high)/2;
  156. s=0;
  157. t=2*n+1;
  158. nv=t+1;
  159. memset(head,-1,sizeof(head));
  160. cnt=0;
  161. for(i=1;i<=n;i++)
  162. {
  163. add(s,i,g1[i]);
  164. add(i,t,g2[i]);
  165. for(j=1;j<i;j++)
  166. {
  167. if(mp[i][j]<=mid)
  168. {
  169. add(i,j,INF);
  170. }
  171. }
  172. }
  173. x=isap();
  174. //printf("---%d\n",x);
  175. if(x>=sum)
  176. {
  177. ans=mid;
  178. high=mid-1;
  179. }
  180. else
  181. {
  182. low=mid+1;
  183. }
  184. }
  185. if(ans==-1)
  186. printf("No Solution\n");
  187. else
  188. printf("%d\n",ans);
  189. }
  190. return 0;
  191. }

POJ 3228Gold Transportation(二分+最大流)的更多相关文章

  1. POJ 3057 Evacuation 二分+最大流

    Evacuation 题目连接: http://poj.org/problem?id=3057 Description Fires can be disastrous, especially when ...

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

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

  3. poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点

    题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...

  4. poj 2318 叉积+二分

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13262   Accepted: 6412 Description ...

  5. uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。

    /** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...

  6. poj 2049(二分+spfa判负环)

    poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...

  7. HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流

    题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    ...

  8. HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流

    二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...

  9. hdu4560 不错的建图,二分最大流

    题意: 我是歌手 Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

随机推荐

  1. <a>元素生成多个<a>的问题,元素标签结尾影响

    告诉我不是真的吧,<a/>和<a></a>真的有区别...

  2. php小数点后取两位的三种实现方法

    php小数点后取两位的方法. 方法一.经常用到小数点后取几位,但不能进位的情况. 比如3.149569取小数点后两位,最后两位不能四舍五入.结果:3.14. 可以使用函数floor. 该函数是舍去取整 ...

  3. Window下 Qt 编译MySQL驱动(居然用到了动态库格式转换工具)

    一步步在Window下开发Qt 今天开始安装MySQL,看了些关于MySQL安装的博文,方法大致相同,但是遇到的细节问题各有不同,或者没有讲全面,下面来说说个人的安装过程及遇到的问题. 1.首先下载, ...

  4. GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

    1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...

  5. 关于mysqli 连接数不能正确释放的解决方案

    /** * 析构函数 */ //解决重复链接的问题 private $db_handler = null; function __destruct() { Log::logWrite($this-&g ...

  6. 在 Windows Azure 网站中配置动态 IP 地址限制

    我们最近对 Windows Azure 网站进行了升级,并启用了IIS8的动态 IP 限制模块.现在,开发人员可以为其网站启用并配置动态 IP 限制功能(或简称 DIPR). 可以通过以下链接查看此 ...

  7. MyGui 3.2.0(OpenGL平台)的编译

    MyGui是一个用来创建用户图形界面的库,用于游戏和3D应用程序.这个库的主要目标是达到:快速.灵活.易用. 1.下载准备: 源代码:http://svn.code.sf.net/p/my-gui/c ...

  8. iOS设计模式——MVC(Model-View-Controller)

    Modol View Controller(MVC)是一种最早的也是最成功的可重用的设计模式,70年代的时候首次在smaltalk编写的程序中成功使用.基于MVC设计 模式,Cocoa整体架构可以划分 ...

  9. 生产环境提升rman备份速度----启动块跟踪

    生产环境提升rman备份速度----启动块跟踪 [环境] AIX(5300-08).oracle10g(10.2.0.1.0-64bit) [目标] 因为生产环境数据量较大,欲加快rman备份的速度 ...

  10. docker基础入门之二

    一.docker文件系统: linuxFS包括boot file system 和 root file system boot file system (bootfs),包含bootloader和ke ...