题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1355

  好题,根本想不到是网络流。

  模型如图:

  假想从右上角到左下角有一条阻拦线,我们就是需要把这条线剪短,搞出一个缺口,使得可以从(1,1)到(n,m)。这个与求网络流的最小割不谋而合,根据上面这个图建立网络流模型,对于a,b两个位置:

  1. 如果a.x == b.x 或者 a.y ==  b.y,那么当|a - b| <= 2*k+1时,从ab之间连一条边(如上图1 -> 3);

  2. 如果a.x != b.x 并且 a.y != b.y,那么 当|a - b| <= 2*k+2时,从ab之间连一条边(如上图2 -> 3);

  3. 如果a节点覆盖到了上边或右边,那么从超级源点连边到a节点(如上图源点到1和2);

  4. 如果a节点覆盖到了下边或左边,那么从a节点连边到超级汇点(如上图4和5到汇点);

  当然,必须对每个点进行拆点,这个就不多讲了。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define L(u) ((u) << 1)
  5. #define R(u) ((u) << 1 | 1)
  6. #define N 1005
  7. #define M 200005
  8. #define INF 0x3f3f3f3f
  9.  
  10. int gap[N],dis[N],pre[N],cur[N];
  11. int n, m, k, NE, s, t;
  12. int head[N];
  13. char g[][];
  14.  
  15. struct Node{
  16. int c,pos,next;
  17. }E[M];
  18.  
  19. struct Mine
  20. {
  21. int x, y;
  22. int id;
  23. }mine[];
  24.  
  25. inline void checkmin(int &a,int b) {if(a == - || a > b)a = b;}
  26.  
  27. void add_edge(int u,int v,int c)
  28. {
  29. E[NE].c = c;
  30. E[NE].pos = v;
  31. E[NE].next = head[u];
  32. head[u] = NE++;
  33.  
  34. E[NE].c = ; // !反向初始为0
  35. E[NE].pos = u;
  36. E[NE].next = head[v];
  37. head[v] = NE++;
  38. }
  39.  
  40. int sap()
  41. {
  42. memset(dis,,sizeof dis);
  43. memset(gap,,sizeof gap);
  44. memcpy (cur, head, sizeof dis);
  45. int u=pre[s]=s,maxflow=,aug=-;
  46. gap[]=n;
  47. while(dis[s]<n)
  48. {
  49. loop:for(int &i=cur[u];i!=-;i=E[i].next)
  50. {
  51. int v=E[i].pos;
  52. if(E[i].c && dis[u]==dis[v]+)
  53. {
  54. checkmin(aug, E[i].c);
  55. pre[v]=u;
  56. u=v;
  57. if(v==t)
  58. {
  59. maxflow+=aug;
  60. for(u=pre[u];v!=s;v=u,u=pre[u])
  61. {
  62. E[cur[u]].c-=aug;
  63. E[cur[u]^].c+=aug;
  64. }
  65. aug=-;
  66. }
  67. goto loop;
  68. }
  69. }
  70. int mindis=n;
  71. for(int i=head[u];i!=-;i=E[i].next)
  72. {
  73. int v=E[i].pos;
  74. if(E[i].c && mindis>dis[v])
  75. {
  76. cur[u]=i;
  77. mindis=dis[v];
  78. }
  79. }
  80. if((--gap[dis[u]])==) break;
  81. gap[dis[u]=mindis+]++;
  82. u=pre[u];
  83. }
  84. return maxflow;
  85. }
  86.  
  87. void init()
  88. {
  89. memset(head, -, sizeof head);
  90. NE = ;
  91. }
  92.  
  93. int main()
  94. {
  95. int cas;
  96. scanf("%d", &cas);
  97. while(cas--)
  98. {
  99. scanf("%d%d%d", &n, &m, &k);
  100. init();
  101.  
  102. int id = ;
  103. for(int i = ; i < n; i++)
  104. {
  105. scanf("%s", g[i]);
  106. for(int j = ; j < m; j++)
  107. if(g[i][j] == '*')
  108. {
  109. mine[id].x = j;
  110. mine[id].y = i;
  111. mine[id].id = id++;
  112. }
  113. }
  114. s = , t = L(id);
  115.  
  116. for(int i = ; i < id; i++)
  117. {
  118. Mine a = mine[i];
  119. if(a.y - k <= || a.x + k >= m-)
  120. add_edge(s, L(i), INF);
  121.  
  122. if(a.y + k >= n- || a.x - k <= )
  123. add_edge(R(i), t, INF);
  124.  
  125. for(int j = i; j < id; j++)
  126. {
  127. if(i == j)
  128. add_edge(L(i), R(i), );
  129. else
  130. {
  131. Mine b = mine[j];
  132. if(((a.x == b.x) && (abs(a.y-b.y) <= *k+)) ||
  133. ((a.y == b.y) && (abs(a.x-b.x) <= *k+)))
  134. {
  135. add_edge(R(i), L(j), INF);
  136. add_edge(R(j), L(i), INF);
  137. }
  138.  
  139. else if((a.x != b.x && a.y != b.y) && abs(a.x-b.x) + abs(a.y-b.y) <= *k+)
  140. {
  141. add_edge(R(i), L(j), INF);
  142. add_edge(R(j), L(i), INF);
  143. }
  144.  
  145. }
  146. }
  147. }
  148.  
  149. n = (id-) * + ; // 所构造图的总节点数
  150. int res=sap();
  151. printf("%d\n", res);
  152. }
  153. return ;
  154. }

CSU 1355 地雷清除计划的更多相关文章

  1. csuoj 1355: 地雷清除计划

    这是一个非常神奇的题: 感觉像一个模拟搜索: 但是竟然可以用网络流来解决: 直接粘题解把: 如果不能走通的话,必然说明能够从右上角(图外面)沿雷“跳” ,一直可以“跳”左下角(图外面) ,因此建好图之 ...

  2. Linux操作系统计划任务

    ++++++++++++++++++++++++++++++++++++++++++++++++标题:Linux操作系统的计划任务内容:计划任务分为单次任务和周期性任务,周期任务分为系统级计划任务和用 ...

  3. 三.cron计划任务

    • 用途:按照设置的时间间隔为用户反复执行某一项固 定的系统任务 • 软件包:cronie.crontabs • 系统服务:crond • 日志文件:/var/log/crond   • 使用 cro ...

  4. DBCC 命令2

    状态查询:收集和显示各类信息,状态检查. 如cachestats.pss.sqlmgrstats.memorystatus.proccache.freeproccache.freesystemcach ...

  5. 《Xenogears》(异度装甲)隐含的原型与密码

    <Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...

  6. 【linux之crontab,启动】

    一.计划任务 atd at命令发布的任务计划 一次性的任务计划 at time ctrl+d 提交 time: 1.绝对时间:12:00 2.相对时间:+8 3.模糊时间:noon midnight ...

  7. DataGuard 单实例到RAC搭建

    背景简介: 本文为针对一次windows平台RAC数据库迁移至Linux平台RAC的笔记,基本步骤为: 1.搭建windows RAC到Linux 单实例数据库的DataGuard 2.做switch ...

  8. FtpCopy数据定时自动备份软件(FTP定时备份)

    1. 软件说明 FtpCopy是一款免费的FTP数据自动备份软件,如果FtpCopy对您有较大的帮助,欢迎捐赠我们,我们对您表示衷心的感谢! 如果有需求的话会一直更新下去,将软件做到极致! 有问题可直 ...

  9. 使用json改写网站

    效果图 json文件 https://raw.githubusercontent.com/sherryloslrs/timetable/master/timetable.json { "Ti ...

随机推荐

  1. 数字表格(product)

    Portal -->broken qwq Description ​  求\(\prod\limits_{i=1}^n\prod\limits_{j=1}^m f[gcd(i,j)](mod\ ...

  2. 【learning】快速沃尔什变换FWT

    问题描述 已知\(A(x)\)和\(B(x)\),\(C[i]=\sum\limits_{j\otimes k=i}A[j]*B[k]\),求\(C\) 其中\(\otimes\)是三种位运算的其中一 ...

  3. 洛谷P1434 滑雪

    题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...

  4. [NOI2010] 能量采集 (数学)

    [NOI2010] 能量采集 题目描述 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. ...

  5. [DeeplearningAI笔记]卷积神经网络2.2经典网络

    4.2深度卷积网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 [LeNet]--Lécun Y, Bottou L, Bengio Y, et al. Gradient-bas ...

  6. libxml移植到android

    libxml是C语言写的xml解析库,是我们开发可移植程序的首选,下面讲述将其移植到android的步骤 1.下载已经配置好的源代码包android_libxml2.rar http://pan.ba ...

  7. ③ 设计模式的艺术-09.组合(Composite)模式

    使用组合模式的场景 类图当中有三个类,一个是Component(节点的统一接口),它的目的是为了统一节点的操作.接下来的两个实现类,一个则是非叶子节点(Composite),它可以有子节点.另外一个则 ...

  8. 遍历hashmap

    转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: Map map = new HashM ...

  9. 【BZOJ】1355 [Baltic2009]Radio Transmission

    [算法]KMP [题解]KMP中n-next[n]得到最小循环节的性质. 考虑一个循环串(最后一个循环节可能残缺),它最长的[后缀=前缀]一定是以第二个循环节为起始位置的后缀. 正着考虑的话假设后缀T ...

  10. 通过删除hbase表中的region来达到删除表中数据

    公司最近在搞一个hbase删除数据,由于在建表的时候是通过region来对每日的数据进行存储的,所以要求在删除的时候直接通过删除region的来删除数据(最好的方案是只删除region中的数据,不把r ...