Description

  在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃
到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石
柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不
变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个
石柱上。

Input

  输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱
,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。

Output

  输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。

Sample Input

5 8 2
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........

Sample Output

1

HINT

100%的数据满足:1<=r, c<=20, 1<=d<=4

Solution

最大流。

拆点,将一个点拆成两个点,一个点表示进来,另一个点表示出去。进来出去的点的个数不能超过数字个数。然后距离d以内的连一下最后流一下就好了。

Code

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <queue>
  6.  
  7. #ifdef WIN32
  8. #define LL "%I64d"
  9. #else
  10. #define LL "%lld"
  11. #endif
  12.  
  13. #ifdef CT
  14. #define debug(...) printf(__VA_ARGS__)
  15. #define setfile()
  16. #else
  17. #define debug(...)
  18. #define filename ""
  19. #define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout)
  20. #endif
  21.  
  22. #define R register
  23. #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
  24. #define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
  25. #define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
  26. #define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
  27. #define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
  28. #define cabs(_x) ((_x) < 0 ? (- (_x)) : (_x))
  29. char B[ << ], *S = B, *T = B;
  30. inline int F()
  31. {
  32. R char ch; R int cnt = ; R bool minus = ;
  33. while (ch = getc(), (ch < '' || ch > '') && ch != '-') ;
  34. ch == '-' ? minus = : cnt = ch - '';
  35. while (ch = getc(), ch >= '' && ch <= '') cnt = cnt * + ch - '';
  36. return minus ? -cnt : cnt;
  37. }
  38. #define maxn 30
  39. #define maxp 10010
  40. #define maxm 1000010
  41. #define inf 0x7fffffff
  42. char mp[maxn][maxn], mp2[maxn][maxn];
  43. int id[maxn][maxn][], id2[maxn][maxn];
  44. struct Edge
  45. {
  46. Edge *next, *rev;
  47. int to, cap;
  48. }*last[maxp], *cur[maxp], e[maxm], *ecnt = e;
  49. int dep[maxp], s, t, ans;
  50. std::queue<int> q;
  51. inline void link(R int a, R int b, R int w)
  52. {
  53. // printf("%d %d %d\n", a, b, w );
  54. *++ecnt = (Edge) {last[a], ecnt + , b, w}; last[a] = ecnt;
  55. *++ecnt = (Edge) {last[b], ecnt - , a, }; last[b] = ecnt;
  56. }
  57. inline bool bfs()
  58. {
  59. memset(dep, -, sizeof (dep));
  60. dep[t] = ; q.push(t);
  61. while (!q.empty())
  62. {
  63. R int now = q.front(); q.pop();
  64. for (R Edge *iter = last[now]; iter; iter = iter -> next)
  65. {
  66. R int pre = iter -> to;
  67. if (dep[pre] == - && iter -> rev -> cap)
  68. {
  69. dep[pre] = dep[now] + ;
  70. q.push(pre);
  71. }
  72. }
  73. }
  74. return dep[s] != -;
  75. }
  76. int dfs(R int x, R int f)
  77. {
  78. if (x == t) return f;
  79. R int used = ;
  80. for (R Edge* &iter = cur[x]; iter; iter = iter -> next)
  81. {
  82. R int pre = iter -> to;
  83. if (iter -> cap && dep[x] == dep[pre] + )
  84. {
  85. R int v = dfs(pre, dmin(iter -> cap, f - used));
  86. iter -> cap -= v;
  87. iter -> rev -> cap += v;
  88. used += v;
  89. if (f == used) return f;
  90. }
  91. }
  92. if (!used) dep[x] = -;
  93. return used;
  94. }
  95. inline void dinic()
  96. {
  97. while (bfs())
  98. {
  99. memcpy(cur, last, sizeof last);
  100. ans += dfs(s, inf);
  101. }
  102. }
  103. int main()
  104. {
  105. // setfile();
  106. R int n = F(), m = F(), k = F(), cnt = , tot = ;
  107. for (R int i = ; i <= n; ++i, getc())
  108. for (R int j = ; j <= m; ++j)
  109. {
  110. mp[i][j] = getc();
  111. if (mp[i][j] > '')
  112. {
  113. id[i][j][] = ++cnt;
  114. id[i][j][] = ++cnt;
  115. link(cnt - , cnt, mp[i][j] - '');
  116. }
  117. }
  118. // for (R int i = 1; i <= n; ++i) puts(mp[i] + 1);
  119. for (R int i = ; i <= n; ++i, getc())
  120. for (R int j = ; j <= m; ++j)
  121. {
  122. mp2[i][j] = getc();
  123. mp2[i][j] == 'L' ? ++tot : ;
  124. }
  125. t = ++cnt;
  126. for (R int i = ; i <= n; ++i)
  127. for (R int j = ; j <= m; ++j)
  128. if (mp[i][j] > '')
  129. {
  130. for (R int ii = -k; ii <= k; ++ii)
  131. for (R int jj = -k; jj <= k; ++jj)
  132. if (i + ii > && i + ii <= n && j + jj > && j + jj <= m && !(ii == && jj == ) && mp[i + ii][j + jj] > '' && ii * ii + jj * jj <= k * k)
  133. link(id[i][j][], id[i + ii][j + jj][], inf);
  134. if (dmin(i, n - i + ) <= k || dmin(j, m - j + ) <= k)
  135. link(id[i][j][], t, inf);
  136. }
  137. for (R int i = ; i <= n; ++i)
  138. for (R int j = ; j <= m; ++j)
  139. if (mp2[i][j] == 'L')
  140. link(s, id[i][j][], );
  141. dinic();
  142. printf("%d\n", tot - ans );
  143. return ;
  144. }
  145. /*
  146. 5 8 2
  147. 00000000
  148. 02000000
  149. 00321100
  150. 02000000
  151. 00000000
  152. ........
  153. ........
  154. ..LLLL..
  155. ........
  156. ........
  157. */

【BZOJ1066】 [SCOI2007]蜥蜴的更多相关文章

  1. BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】

    BZOJ1066 SCOI2007 蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离 ...

  2. bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边 如果 ...

  3. bzoj1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...

  4. BZOJ1066 [SCOI2007]蜥蜴

    首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...

  5. [bzoj1066] [SCOI2007] 蜥蜴 - 网络流

    在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个 ...

  6. BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP

    由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html

  7. 【bzoj1066】[SCOI2007]蜥蜴 网络最大流

    [bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...

  8. 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流

    [bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...

  9. [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴

    [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴 试题描述 在一个 \(r\) 行 \(c\) 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥 ...

  10. 【bzoj1066】【luogu2472】[SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MB Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上 ...

随机推荐

  1. Oracle中的=:

    dept_code=:dCode =:在这里的意思是变量绑定

  2. 浅析射线检测 raycast 的使用 !Cocos Creator 3D !

    哎呀?为什么我设置了节点点击回调没反应呀? 记得在写小鸡拍拍的时候遇到一个问题,想要捕捉排球的点击事件,按照 2d 的写法,给3d 节点添加 node 事件,结果点了没反应.代码大概是以下的样子. t ...

  3. Websocket --(3)实现

    今天介绍另外一种websocket实现方式,结合了spring MVC,并完善了第二节所提到做一个简单的登录认证用来识别用户的名称.界面继续沿用第二节的布局样式,同时增加上线和下线功能. 参考了 ht ...

  4. locust 的几种写法及部分内容说明

    第一种 **********************************   from locust import  HttpLocust, TaskSet, task import  json ...

  5. 关于float的小奥秘

    一. float 存储方式 1.1. float 占四个字节 1.2. 浮点数构成 1.2.1. 无论是单精度还是双精度在存储中都分为三个部分: <1>. 符号位(Sign) : 0代表正 ...

  6. C++中组合和继承的概念及意义

    1,继承在面向对象中具有举足轻重的地位,面向对象当中的很多高级技术都和继承是息息相关的,比如面向对象的高端课程<设计模式>中的每一种技术都和继承有关,因此我们非常有必要在学习 C++ 时, ...

  7. 分位数回归及其Python源码

    分位数回归及其Python源码 天朗气清,惠风和畅.赋闲在家,正宜读书.前人文章,不得其解.代码开源,无人注释.你们不来,我行我上.废话少说,直入主题.o( ̄︶ ̄)o 我们要探测自变量 与因变量 的关 ...

  8. Java Web开发技术教程入门-JSP基本语法和九大内置对象

    这两天气温逐渐升高,好想把自己泡在冰块里······ 恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽.......今天阅读到了这本书的第四章-JSP基本语法.经过第一天的阅读,我们明白JSP技术是Java Web开 ...

  9. HashMap、HashTable、ConcurrentHashMap、TreeMap、LinkedHashMap、WeakHashMap区别

    1. HashMap   标准链地址法实现(下图).数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时 ...

  10. MySQL数据库入门备份数据库

    MySQL数据库入门——备份数据库   一提到数据,大家神经都会很紧张,数据的类型有很多种,但是总归一点,数据很重要,非常重要,因此,日常的数据备份工作就成了运维工作的重点中的重点的重点....... ...