题目链接

给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度。 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, 如果高度变为0, 那么石柱消失, 无法在跳到这个位置上, 跳到的那个石柱高度不会发生改变, 同一时刻一个石柱无法站两个蜥蜴。问有多少蜥蜴无法跳出边界。

很裸的网络流, 如果一个石柱距离边界距离小于d, 那么向汇点连一条权值为inf的边, 如果一个石柱初始有蜥蜴, 那么源点向这个点连一条1的边, 每个点拆成两个点, u向u'连一条边, 权值为高度。 一个石柱向所有距离他曼哈顿距离小于d的石柱连边, 权值inf。 跑一遍网络流就可以...

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pb(x) push_back(x)
  4. #define ll long long
  5. #define mk(x, y) make_pair(x, y)
  6. #define lson l, m, rt<<1
  7. #define mem(a) memset(a, 0, sizeof(a))
  8. #define rson m+1, r, rt<<1|1
  9. #define mem1(a) memset(a, -1, sizeof(a))
  10. #define mem2(a) memset(a, 0x3f, sizeof(a))
  11. #define rep(i, a, n) for(int i = a; i<n; i++)
  12. #define ull unsigned long long
  13. typedef pair<int, int> pll;
  14. const double PI = acos(-1.0);
  15. const double eps = 1e-;
  16. const int mod = 1e9+;
  17. const int inf = ;
  18. const int dir[][] = { {-, }, {, }, {, -}, {, } };
  19. int a[][];
  20. const int maxn = 2e5+;
  21. int q[maxn*], head[maxn*], dis[maxn/], s, t, num;
  22. struct node
  23. {
  24. int to, nextt, c;
  25. node(){}
  26. node(int to, int nextt, int c):to(to), nextt(nextt), c(c){}
  27. }e[maxn*];
  28. void init() {
  29. num = ;
  30. mem1(head);
  31. }
  32. void add(int u, int v, int c) {
  33. e[num] = node(v, head[u], c); head[u] = num++;
  34. e[num] = node(u, head[v], ); head[v] = num++;
  35. }
  36. int bfs() {
  37. mem(dis);
  38. dis[s] = ;
  39. int st = , ed = ;
  40. q[ed++] = s;
  41. while(st<ed) {
  42. int u = q[st++];
  43. for(int i = head[u]; ~i; i = e[i].nextt) {
  44. int v = e[i].to;
  45. if(!dis[v]&&e[i].c) {
  46. dis[v] = dis[u]+;
  47. if(v == t)
  48. return ;
  49. q[ed++] = v;
  50. }
  51. }
  52. }
  53. return ;
  54. }
  55. int dfs(int u, int limit) {
  56. if(u == t) {
  57. return limit;
  58. }
  59. int cost = ;
  60. for(int i = head[u]; ~i; i = e[i].nextt) {
  61. int v = e[i].to;
  62. if(e[i].c&&dis[v] == dis[u]+) {
  63. int tmp = dfs(v, min(limit-cost, e[i].c));
  64. if(tmp>) {
  65. e[i].c -= tmp;
  66. e[i^].c += tmp;
  67. cost += tmp;
  68. if(cost == limit)
  69. break;
  70. } else {
  71. dis[v] = -;
  72. }
  73. }
  74. }
  75. return cost;
  76. }
  77. int dinic() {
  78. int ans = ;
  79. while(bfs()) {
  80. ans += dfs(s, inf);
  81. }
  82. return ans;
  83. }
  84. int main()
  85. {
  86. int n, m, d;
  87. cin>>n>>m>>d;
  88. int mn = m*n, x;
  89. init();
  90. s = *mn, t = s+;
  91. char c[];
  92. for(int i = ; i<n; i++) {
  93. scanf("%s", c);
  94. for(int j = ; j<m; j++) {
  95. a[i][j] = c[j]-'';
  96. if(!a[i][j])
  97. continue;
  98. if(i<d||j<d||i+d>=n||j+d>=m) {
  99. add(i*m+j+mn, t, inf);
  100. }
  101. add(i*m+j, i*m+j+mn, a[i][j]);
  102. }
  103. }
  104. int ans = ;
  105. for(int i = ; i<n; i++) {
  106. scanf("%s", c);
  107. for(int j = ; j<m; j++) {
  108. if(c[j] == 'L') {
  109. add(s, i*m+j, );
  110. ans++;
  111. }
  112. }
  113. }
  114. for(int i = ; i<n; i++) {
  115. for(int j = ; j<m; j++) {
  116. if(!a[i][j])
  117. continue;
  118. for(int x = max(, i-d); x<=min(n-, i+d); x++) {
  119. for(int y = max(, j-d); y<=min(m-, j+d); y++) {
  120. if(x == i&& y==j )
  121. continue;
  122. if(!a[x][y])
  123. continue;
  124. if(abs(x-i)+abs(y-j)>d)
  125. continue;
  126. add(i*m+j+mn, x*m+y, inf);
  127. }
  128. }
  129. }
  130. }
  131. ans -= dinic();
  132. cout<<ans<<endl;
  133. return ;
  134. }

bzoj 1066 : [SCOI2007]蜥蜴 网络流的更多相关文章

  1. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

  2. BZOJ 1066: [SCOI2007]蜥蜴( 最大流 )

    结点容量..拆点然后随便写 --------------------------------------------------------------- #include<cstdio> ...

  3. [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】

    题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 ...

  4. poj 2711 Leapin' Lizards && BZOJ 1066: [SCOI2007]蜥蜴 最大流

    题目链接:http://poj.org/problem?id=2711 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1066 Your p ...

  5. BZOJ 1066 [SCOI2007]蜥蜴(最大流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1066 [题目大意] 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些 ...

  6. bzoj 1066: [SCOI2007] 蜥蜴

    这道题还是挺好想的,但我一开始还是想错了…… 把每个石柱拆成两个点,一个入度,一个出度,两个点连一条容量为高度的边,这样就可以限制从此石柱上经过的蜥蜴的数量.关于蜥蜴是否单独成点,我是单独当成了一个点 ...

  7. 1066: [SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3545  Solved: 1771[Submit][Status] ...

  8. 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...

  9. 【BZOJ】1066: [SCOI2007]蜥蜴

    [算法]网络流-最大流(dinic) [题解] 构图思路: 因为石柱高度是可以被消耗的,即一根石柱可通过的蜥蜴数量有限,取舍问题中这样表示容量的属性显然可以作为网络流中的边. 于是将一根石柱拆成顶部和 ...

随机推荐

  1. 获取xml文件

    <?xml version="1.0" encoding="utf-8" ?><ArrayOfSystemRool xmlns:xsi=&qu ...

  2. Mac浏览器全屏设置

    在 mac 升级之后,以往点击放大的按钮,现在显示的效果是全屏:

  3. DOM缘起

    DOM是现在按W3C标准的浏览器均实现的标准.HTML.CSS.DOM共同在结构.表现.交互上共同支撑起一个页面.当然,必须以用户为中心.平稳退化.逐渐增强.DOM的操作是通过JS来实现的.JS最初在 ...

  4. jquery中validate插件表单验证

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  5. git彻底删除commit记录的方法

    在github上,如果非默认分支的话,直接用以下方法: git reset --hard <commit_id> git push origin HEAD --force 如是默认分支,需 ...

  6. struts2笔记04-XxxAware接口

    1.XxxAware接口 ApplicationAware, RequestAware,SessionAware, ParameterAware.      struts2提供了这四个Aware接口用 ...

  7. codeforces 659F . Polycarp and Hay 搜索

    题目链接 遍历每个点, 如果这个点的值能被k整除并且k/a[i][j]后小于等于n*m, 那么就对这个点进行搜索. 将这个点加入队列, 将周围的所有大于等于这个点的值的点也加入队列. 不断重复, 直到 ...

  8. JAVA并发,BlockingQuene

    BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类1.ArrayBlo ...

  9. 使用百度语音识别REST API,做全平台语音识别

    百度语音开发介绍文档: http://yuyin.baidu.com/docs/asr# 使用语音识别,需要在百度申请一个应用,然后拿到API Key和Secret Key,然后才可以使用语音识别 p ...

  10. IP地址获取到为0:0:0:0:0:0:0:1

    引用 13 楼 oXiaoShe 的回复: Quote: 引用 11 楼 ahjsdzm 的回复: [Quote=引用 9 楼 huazaiyou 的回复:]最近在进行web开发时,遇到了reques ...