首先。。。这是道(很水的)网络流

我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳

但是还有柱子高度的限制,于是把柱子拆点为p1和p2,p1向p2连边,边权为柱子高度

对于相距(注意!是欧几里得距离!)小于d的两个柱子p和q,q2向p1连边,p2向q1连边,边权为inf

S向有蜥蜴的柱子的p1连边,边权为1,可以一步跳出去的柱子p2向T连边,边权为inf

跑最大流即可

  1. /**************************************************************
  2. Problem: 1066
  3. User: rausen
  4. Language: C++
  5. Result: Accepted
  6. Time:136 ms
  7. Memory:12656 kb
  8. ****************************************************************/
  9.  
  10. #include <cstdio>
  11. #include <cstring>
  12. #include <algorithm>
  13.  
  14. using namespace std;
  15. const int N = 1e3 + ;
  16. const int M = N * N;
  17. const int inf = 1e9;
  18.  
  19. struct edge {
  20. int next, to, f;
  21. edge(int _n = , int _t = , int _f = ) : next(_n), to(_t), f(_f) {}
  22. } e[M];
  23.  
  24. int n, m, D, cnt_p, S, T, ans;
  25. int first[N], tot = ;
  26. int w[][];
  27. int d[N], q[N];
  28.  
  29. inline void Add_Edges(int x, int y, int f) {
  30. e[++tot] = edge(first[x], y, f), first[x] = tot;
  31. e[++tot] = edge(first[y], x, ), first[y] = tot;
  32. }
  33.  
  34. #define y e[x].to
  35. #define p q[l]
  36. bool bfs() {
  37. static int l, r, x;
  38. memset(d, -, sizeof(d));
  39. d[q[] = S] = ;
  40. for (l = r = ; l != r + ; ++l)
  41. for (x = first[p]; x; x = e[x].next)
  42. if (!~d[y] && e[x].f) {
  43. d[q[++r] = y] = d[p] + ;
  44. if (y == T) return ;
  45. }
  46. return ;
  47. }
  48. #undef p
  49.  
  50. int dfs(int p, int lim) {
  51. if (p == T || !lim) return lim;
  52. int x, tmp, rest = lim;
  53. for (x = first[p]; x && rest; x = e[x].next)
  54. if (d[y] == d[p] + && ((tmp = min(e[x].f, rest)) > )) {
  55. rest -= (tmp = dfs(y, tmp));
  56. e[x].f -= tmp, e[x ^ ].f += tmp;
  57. if (!rest) return lim;
  58. }
  59. if (rest) d[p] = -;
  60. return lim - rest;
  61. }
  62. #undef y
  63.  
  64. inline int Dinic() {
  65. int res = ;
  66. while (bfs())
  67. res += dfs(S, inf);
  68. return res;
  69. }
  70.  
  71. template <class T> T sqr(T x) {
  72. return x * x;
  73. }
  74.  
  75. #define in(x, y) w[x][y] * 2 - 1
  76. #define out(x, y) w[x][y] * 2
  77. int main() {
  78. int i, j, k, l;
  79. char ch;
  80. scanf("%d%d%d", &n, &m, &D);
  81. for (cnt_p = , i = ; i <= n; ++i)
  82. for (j = ; j <= m; ++j) {
  83. ch = getchar();
  84. while (ch < '' || ch > '') ch = getchar();
  85. w[i][j] = ++cnt_p;
  86. if (ch != '') Add_Edges(in(i, j), out(i, j), ch - '');
  87. }
  88. S = cnt_p * + , T = S + ;
  89. for (i = ; i <= n; ++i)
  90. for (j = ; j <= m; ++j)
  91. for (k = ; k <= n; ++k)
  92. for (l = ; l <= m; ++l)
  93. if (sqr(i - k) + sqr(j - l) <= D * D && ((i != k) || (j != l)))
  94. Add_Edges(out(i, j), in(k, l), inf);
  95. for (i = ; i <= n; ++i)
  96. for (j = ; j <= m; ++j) {
  97. ch = getchar();
  98. while (ch != '.' && ch != 'L') ch = getchar();
  99. if (ch == 'L') ++ans, Add_Edges(S, in(i, j), );
  100. if (i <= D || j <= D || i > n - D || j > m - D)
  101. Add_Edges(out(i, j), T, inf);
  102. }
  103. printf("%d\n", ans - Dinic());
  104. return ;
  105. }
  106. #undef in
  107. #undef out

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] 蜥蜴 - 网络流

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Strategy策略模式

    策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...

  2. 从xubuntu-->windows xp

    捣鼓了两个月的ubuntu之后我又乖乖的回到了windows的怀抱,不是抛弃linux而是要适应身边的环境. 身边的板子的驱动基本上都是xp的老一点的还是vista的,让人情何以堪. 我努力克服了,用 ...

  3. T-SQL JOIN

    a表name sex张三 男李四 女 b表name age李四 30王五 23 1 全外连接select a.name,a.sex,b.name,b.agefrom a full outer join ...

  4. 数据结构B树

    B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...

  5. Java多线程同步问题的探究

    一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...

  6. iOS - UISegmentedControl

    前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UISegmentedControl : UIControl <NSCoding> @available ...

  7. http1.1和http1.0区别

    http1.1和服务器建立连接可以获得多个资源 http1.0和服务器建立连接可以获取一个值

  8. UI设计基础百科

    摘自:http://www.csdn.net/article/2013-09-10/2816892-iOS-dev-tools-design 我的原型设计流程 这是一份UX原型设计流程,用来探索交互设 ...

  9. CSocket必须使用stream socket不能够使用数据报 socket

    如果使用MFC socket类CSoket通讯,必须使用stream socket,不能够使用 SOCK_DGRAM 类型socket.原因如下: 1 stream socket和数据报socket的 ...

  10. UnicodeEncodeError

    UnicodeEncodeError at /admin/shop/product/add/ 'ascii' codec can't encode characters in position 0-1 ...