题意:见题面

思路:http://www.cnblogs.com/chenyushuo/p/5139556.html

必须交换b1,b2做第二次最大流的原因:

假如一个a1到b2的一个流和b1到a2的一个流分别经过了一个桥的两个端点(u,v),如图

我们就可以将a1到b2的流量改为经过u-v-a2-T到达T,同理将b1到a2的流量改为经过v-u-b2-T到达T,这样就说明这个流是没有问题的
在这种情况下将b1和b2交换后,流量显然不会有变化
如果一个a1到b2的一个流和b1到a2的一个流没有经过任何一个桥的两个端点,这个流显然不合法,且在b1和b2交换后,流量会减小
  1. var fan:array[..]of longint;
  2. head,vet,next,gap,len,dis:array[..]of longint;
  3. a:array[..,..]of char;
  4. ch:string;
  5. n,m,i,tot,x1,x2,y1,y2,s1,s2,src,source,s,j:longint;
  6. flag:boolean;
  7.  
  8. function min(x,y:longint):longint;
  9. begin
  10. if x<y then exit(x);
  11. exit(y);
  12. end;
  13.  
  14. procedure add(a,b,c:longint);
  15. begin
  16. inc(tot);
  17. next[tot]:=head[a];
  18. vet[tot]:=b;
  19. len[tot]:=c;
  20. head[a]:=tot;
  21.  
  22. inc(tot);
  23. next[tot]:=head[b];
  24. vet[tot]:=a;
  25. len[tot]:=;
  26. head[b]:=tot;
  27. end;
  28.  
  29. function dfs(u,aug:longint):longint;
  30. var e,v,t,val,flow:longint;
  31. begin
  32. if u=src then exit(aug);
  33. e:=head[u]; flow:=; val:=s-;
  34. while e<> do
  35. begin
  36. v:=vet[e];
  37. if len[e]> then
  38. begin
  39. if dis[u]=dis[v]+ then
  40. begin
  41. t:=dfs(v,min(len[e],aug-flow));
  42. len[e]:=len[e]-t;
  43. len[fan[e]]:=len[fan[e]]+t;
  44. flow:=flow+t;
  45. if dis[source]>=s then exit(flow);
  46. if aug=flow then break;
  47. end;
  48. val:=min(val,dis[v]);
  49. end;
  50. e:=next[e];
  51. end;
  52. if flow= then
  53. begin
  54. dec(gap[dis[u]]);
  55. if gap[dis[u]]= then dis[source]:=s;
  56. dis[u]:=val+;
  57. inc(gap[dis[u]]);
  58. end;
  59. exit(flow);
  60. end;
  61.  
  62. function maxflow:longint;
  63. var ans:longint;
  64. begin
  65. fillchar(gap,sizeof(gap),);
  66. fillchar(dis,sizeof(dis),);
  67. gap[]:=s; ans:=;
  68. while dis[source]<s do ans:=ans+dfs(source,maxlongint);
  69. exit(ans);
  70. end;
  71.  
  72. procedure build;
  73. var i,j:longint;
  74. begin
  75. for i:= to n do
  76. for j:= to n do
  77. begin
  78. if a[i,j]='O' then add(i,j,);
  79. if a[i,j]='N' then add(i,j,maxlongint);
  80. end;
  81. end;
  82.  
  83. begin
  84. assign(input,'bzoj3504.in'); reset(input);
  85. assign(output,'bzoj3504.out'); rewrite(output);
  86. for i:= to do
  87. if i mod = then fan[i]:=i+
  88. else fan[i]:=i-;
  89. while not eof do
  90. begin
  91. readln(n,x1,y1,s1,x2,y2,s2);
  92. if n= then break;
  93. inc(x1); inc(y1); inc(x2); inc(y2);
  94. tot:=; for i:= to n+ do head[i]:=;
  95. for i:= to n do
  96. begin
  97. readln(ch);
  98. for j:= to n do a[i,j]:=ch[j];
  99. end;
  100. s:=n; source:=s+; src:=s+; s:=s+;
  101. build;
  102. add(source,x1,*s1);
  103. add(source,x2,*s2);
  104. add(y1,src,*s1);
  105. add(y2,src,*s2);
  106. flag:=true;
  107. if maxflow<*(s1+s2) then flag:=false;
  108. if flag then
  109. begin
  110. tot:=; for i:= to n+ do head[i]:=;
  111. build;
  112. add(source,x1,*s1);
  113. add(source,y2,*s2);
  114. add(y1,src,*s1);
  115. add(x2,src,*s2);
  116. if maxflow<*(s1+s2) then flag:=false;
  117. end;
  118. if flag then writeln('Yes')
  119. else writeln('No');
  120. end;
  121. close(input);
  122. close(output);
  123. end.
 

【BZOJ3504】危桥(最大流)的更多相关文章

  1. [CQOI2014][bzoj3504] 危桥 [最大流]

    题面 传送门 思路 这道题中惟一的特别之处,就在于"危桥"这一个只能走两次的东西 我的第一想法是做一个dp,但是这道题只需要能不能走,也没有必要 网络流?貌似是个很好的选择 我们把 ...

  2. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...

  3. BZOJ.3504.[CQOI2014]危桥(最大流ISAP)

    BZOJ 洛谷 这种题大多是多源多汇跑网络流.往返\(a_n/b_n\)次可以看做去\(a_n/b_n\)次,直接把危桥能走的次数看做\(1\). 先不考虑别的,直接按原图建模:危桥建双向边容量为\( ...

  4. bzoj3504: [Cqoi2014]危桥--最大流

    题目大意:给张无向图,有两个人a,b分别从各自的起点走向各自的终点,走A,B个来回,图里有些边只能走两次,求问是否能满足a,b的需求 按照题目给的表建图 S连a1,b1 a2,b2连T 跑最大流看是否 ...

  5. BZOJ3504 CQOI2014危桥(最大流)

    如果只有一个人的话很容易想到最大流,正常桥连限流inf双向边,危桥连限流2双向边即可.现在有两个人,容易想到给两起点建超源两汇点建超汇,但这样没法保证两个人各自到达自己要去的目的地.于是再超源连一个人 ...

  6. 【BZOJ3504】危桥(网络流)

    [BZOJ3504]危桥(网络流) 题面 BZOJ 洛谷 Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的, ...

  7. 3504. [CQOI2014]危桥【最大流】

    Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...

  8. 洛谷3163 CQOI2014危桥 (最大流)

    一开始想了一发费用流做法然后直接出负环了 首先,比较显然的思路就是对于原图中没有限制的边,对应的流量就是\(inf\),如果是危桥,那么流量就应该是\(2\). 由于存在两个起始点,我们考虑直接\(s ...

  9. 【BZOJ】【3504】【CQOI2014】危桥

    网络流/最大流 比较裸的最大流= = 无向图上走来回其实就等价与走两遍>_> 如果路径有相交其实不影响答案的 比较恶心的是两个人路过同一座桥,但走的方向不同互相抵消流量了…… 其实只要在第 ...

  10. [CQOI2014]危桥

    题目描述 Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多只能通行两次. ...

随机推荐

  1. JavaBean用JSP调用和使用JSP动作标签的区别

    javabean的类可以用jsp动作标签实例化并使用. <!-- 下面这句是对Javabean类person的引用,引用的实例是p2 --> <jsp:useBean id=&quo ...

  2. 主题:Android、iPhone和Java三个平台一致的加密工具

    先前一直在做安卓,最近要开发iPhone客户端,这其中遇到的最让人纠结的要属Java.Android和iPhone三个平台加解密不一致的问题.因为手机端后台通常是用JAVA开发的Web Service ...

  3. 用.htaccess获取文件夹和文件名

    有时需要重定向/article/1.html文件到index.php 把.htaccess放在和index.php同一个文件夹内 反向引用中的$1代表目录,$2代表去除.html后缀后的文件名 Rew ...

  4. java之main

    Java中用户向系统传递参数的三种基本方式 main方法 在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的 ...

  5. Docker之Web-UI

    DockerUI 不支持多主机Command: docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock dock ...

  6. Alpha版本——Postmortem会议

    No Bug 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 设想和目标 1.我们的软件要解决什么 ...

  7. google protocol buffer 使用说明

    一:编译源码 下载地址:http://code.google.com/p/protobuf/downloads/list 下载后,根据编译说明进行编译. windows 平台,直接打开msvc中的工程 ...

  8. 通过List<String>动态传递参数给 sqlcommand.Parameters

    通过List<String>动态传递参数 private void GetallChecked_TreeNote(TreeNodeCollection aNodes, ref int To ...

  9. 【转】贾扬清:希望Caffe成为深度学习领域的Hadoop

    [转:http://www.csdn.net/article/2015-07-07/2825150] 在深度学习(Deep Learning)的热潮下,Caffe作为一个高效.实用的深度学习框架受到了 ...

  10. ConfigParser.MissingSectionHeaderError: File contains no section headers.

    今天使用ConfigParser解析一个ini文件,报出如下错误: config.read(logFile) File "C:\Python26\lib\ConfigParser.py&qu ...