思路:这题的原型题是比较经典的网络流。原型题模型就是把所有的障碍去掉。

有障碍做法还是一样的,只用将每个列和行重新划分,求最大流就行了。

  1. #include <cstring>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <cstdio>
  5. #define Maxn 120010
  6. #define Maxm 210000
  7. #define LL int
  8. #define inf 100000000
  9. #define Abs(a) (a)>0?(a):(-a)
  10. using namespace std;
  11. struct Edge{
  12. int from,to,next;
  13. LL val;
  14. }edge[Maxm];
  15. const double eps=1e-;
  16. LL value[Maxn];
  17. int head[Maxn],work[Maxn],dis[Maxn],q[Maxn],e,vi[Maxn];
  18. void init()
  19. {
  20. e=;
  21. memset(head,-,sizeof(head));
  22. }
  23. void add1(int u,int v,LL c)//有向边
  24. {
  25. edge[e].to=v;edge[e].val=c;edge[e].next=head[u];head[u]=e++;
  26. edge[e].to=u;edge[e].val=;edge[e].next=head[v];head[v]=e++;
  27. }
  28. void add2(int u,int v,LL c)//无向边
  29. {
  30. edge[e].to=v;edge[e].val=c;edge[e].next=head[u];head[u]=e++;
  31. edge[e].to=u;edge[e].val=c;edge[e].next=head[v];head[v]=e++;
  32. }
  33. int bfs(int S,int T)
  34. {
  35. int rear=;
  36. memset(dis,-,sizeof(dis));
  37. dis[S]=;q[rear++]=S;
  38. for(int i=;i<rear;i++)
  39. {
  40. for(int j=head[q[i]];j!=-;j=edge[j].next)
  41. {
  42. if(edge[j].val&&dis[edge[j].to]==-)
  43. {
  44. dis[edge[j].to]=dis[q[i]]+;
  45. q[rear++]=edge[j].to;
  46. if(edge[j].to==T) return ;
  47. }
  48. }
  49. }
  50. return ;
  51. }
  52. LL dfs(int cur,LL a,int T)
  53. {
  54. if(cur==T) return a;
  55. for(int &i=work[cur];i!=-;i=edge[i].next)
  56. {
  57. if(edge[i].val&&dis[edge[i].to]==dis[cur]+)
  58. {
  59. LL t=dfs(edge[i].to,min(a,edge[i].val),T);
  60. if(t)
  61. {
  62. edge[i].val-=t;
  63. edge[i^].val+=t;
  64. return t;
  65. }
  66. }
  67. }
  68. return ;
  69. }
  70. LL Dinic(int S,int T)
  71. {
  72. LL ans=;
  73. while(bfs(S,T))
  74. {
  75. memcpy(work,head,sizeof(head));
  76. while(LL t=dfs(S,inf,T)) ans+=t;
  77. }
  78. return ans;
  79. }
  80. int g[][],row,col,beg[][],gg[][];
  81. void build(int n,int m)
  82. {
  83. int i,j,f=;
  84. row=col=;
  85. for(i=;i<=m;i++){
  86. f=;
  87. for(j=;j<=n;j++){
  88. if(g[j][i]==) f=;
  89. if(g[j][i]!=&&!f) col++,f=;
  90. if(g[j][i]!=)
  91. beg[j][i]=col;
  92. }
  93. }
  94. for(i=;i<=n;i++){
  95. f=;
  96. for(j=;j<=m;j++){
  97. if(g[i][j]==) f=;
  98. if(g[i][j]!=&&!f) row++,f=;
  99. if(g[i][j]!=)
  100. gg[i][j]=row;
  101. }
  102. }
  103. for(i=;i<=row;i++){
  104. add1(,i,);
  105. }
  106. for(i=;i<=col;i++){
  107. add1(i+row,row+col+,);
  108. }
  109. for(i=;i<=n;i++){
  110. for(j=;j<=m;j++){
  111. if(g[i][j]==){
  112. add1(gg[i][j],beg[i][j]+row,);
  113. }
  114. }
  115. }
  116. }
  117. int main()
  118. {
  119. int n,m,i,j,num=,t,x,y,p,w;
  120. scanf("%d",&t);
  121. while(t--){
  122. init();
  123. memset(g,,sizeof(g));
  124. memset(beg,,sizeof(beg));
  125. memset(gg,,sizeof(gg));
  126. scanf("%d%d",&n,&m);
  127. scanf("%d",&p);
  128. for(i=;i<=p;i++){
  129. scanf("%d%d",&x,&y);
  130. g[x][y]=;
  131. }
  132. scanf("%d",&w);
  133. for(i=;i<=w;i++){
  134. scanf("%d%d",&x,&y);
  135. g[x][y]=;
  136. }
  137. build(n,m);
  138. if(row==||col==||p==){
  139. printf("0\n");
  140. continue;
  141. }
  142. int ans=Dinic(,row+col+);
  143. printf("%d\n",ans);
  144. }
  145. return ;
  146. }

uva 12549 最大流的更多相关文章

  1. uva 12549

    12549 - Sentry Robots Time limit: 1.000 seconds We need to guard a set of points of interest using s ...

  2. UVa 11082 & 最大流的行列模型

    题意: 给出一个矩阵前i行的和与前j列的和,(i∈[1,r],j属于[1,c]),每个元素ai,j∈[1,20],请你还原出这个矩阵,保证有解. SOL: 给网络流建模跪了,神一样的建图,如果我我会怎 ...

  3. uva 10330 最大流

    拆点  将节点 i 的容量拆成从 i 到 i+n 的边的容量 套用最大流模板 ac #include <cstdio> #include <cstdlib> #include ...

  4. 【网络流#5】UVA 11082 最大流

    网络流题目最有意思的地方就是构图了,毕竟套模板每个人都会的 现在有一个矩阵,已知前i行元素之和a[i](1<=i<=n),前j列元素之和b[j](1<=j<=m),求一个可行的 ...

  5. 【网络流#4】UVA 753 最大流

    最近开始刷网络流的题目了,先从紫书上的开始,这道题是P374上的,嘛,总之这道题最终还是参考了一下紫书. 中间是用了STL中map将字符串映射成编号,使用编号总比是用字符串简单的多. 超级源点S与各个 ...

  6. UVA 12549 - 二分图匹配

    题意:给定一个Y行X列的网格,网格种有重要位置和障碍物.要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围.机器人不会 ...

  7. UVa 10806 & 费用流+意识流...

    题意: 一张无向图,求两条没有重复的从S到T的路径. SOL: 网络流为什么屌呢..因为网络流的容量,流量,费用能对许许多多的问题进行相应的转化,然后它就非常的屌. 对于这道题呢,不是要没有重复吗?不 ...

  8. uva 11380(最大流+拆点)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36707 思路:根据题意拆点建图即可. #include<io ...

  9. UVa 12549 机器人警卫(最小点覆盖)

    https://vjudge.net/problem/UVA-12549 题意: 在一个Y行X列的网格里有空地(.),重要位置(*)和障碍物(#),用最少的机器人看守所有重要位置,每个机器人要放在一个 ...

随机推荐

  1. C#.Net中的非托管代码清理

    帮助其它项目组Review代码过程,发现有些地方实现了IDispose接口,同时也发现了一些关于IDispose的问题: 1.A类型实现了IDispose接口,B类型里面含有A类型的字段,B类型没有实 ...

  2. 开发extjs常用的插件

    Spket是目前支持Ext 2.0最为出色的IDE. 它采用.jsb project file 文件并将继承于基类和所有文档的内容嵌入到生成代码提示的Script doc中.注:不支持配置项的代码提示 ...

  3. hdu4291之矩阵快速幂

    A Short problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. uva193 - Graph Coloring

    Graph Coloring You are to write a program that tries to find an optimal coloring for a given graph. ...

  5. jQuery打印Html页面自动分页

    最近项目中需要用到打印HTML页面,需要指定区域打印,使用jquery.PrintArea.js 插件 用法: $("div#printmain").printArea(); 但还 ...

  6. 【剑指offer】递归循环两种方式反转链表

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25737023 本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上AC. 题目描写 ...

  7. Android简单封装类似JQuery异步请求

    在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作 ...

  8. 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19

    一.什么是HOOK? "hook"这个单词的意思是"钩子","Windows Hook"是Windows消息处理机制的一个重要扩展,程序猿能 ...

  9. EasyUI基础入门之Pagination(分页)

    前言 对于一些企业级的应用来说(非站点),页面上最为基本的内容也就是表格和form了.对于类似于ERP这类系统来说数据记录比較大,前端表格展示的时候必需得实现分页功能了.恰巧EasyUI就提供了分页组 ...

  10. iOS开发——实用技术OC篇&8行代码教你搞定导航控制器全屏滑动返回效果

    8行代码教你搞定导航控制器全屏滑动返回效果 前言 如果自定了导航控制器的自控制器的leftBarButtonItem,可能会引发边缘滑动pop效果的失灵,是由于 self.interactivePop ...