很普通的拆点网络流,把每个柱子拆成两个点(i,j,0)和(i,j,1).对于柱子的高度限制则加边((i,j,0),(i,j,1),height).

两个柱子能互相到达则加边((i,j,1),(i1,j1,0),INF). 能到达边界的柱子加边((i,j,1),t,INF).有蜥蜴的柱子加边(s,(i,j,0),1).

跑一遍最大流,答案就是总蜥蜴数-最大流。

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <cstdlib>
  4. # include <iostream>
  5. # include <vector>
  6. # include <queue>
  7. # include <stack>
  8. # include <map>
  9. # include <set>
  10. # include <cmath>
  11. # include <algorithm>
  12. using namespace std;
  13. # define lowbit(x) ((x)&(-x))
  14. # define pi acos(-1.0)
  15. # define eps 1e-
  16. # define MOD
  17. # define INF
  18. # define mem(a,b) memset(a,b,sizeof(a))
  19. # define FOR(i,a,n) for(int i=a; i<=n; ++i)
  20. # define FO(i,a,n) for(int i=a; i<n; ++i)
  21. # define bug puts("H");
  22. # define lch p<<,l,mid
  23. # define rch p<<|,mid+,r
  24. # define mp make_pair
  25. # define pb push_back
  26. typedef pair<int,int> PII;
  27. typedef vector<int> VI;
  28. # pragma comment(linker, "/STACK:1024000000,1024000000")
  29. typedef long long LL;
  30. int Scan() {
  31. int res=, flag=;
  32. char ch;
  33. if((ch=getchar())=='-') flag=;
  34. else if(ch>=''&&ch<='') res=ch-'';
  35. while((ch=getchar())>=''&&ch<='') res=res*+(ch-'');
  36. return flag?-res:res;
  37. }
  38. void Out(int a) {
  39. if(a<) {putchar('-'); a=-a;}
  40. if(a>=) Out(a/);
  41. putchar(a%+'');
  42. }
  43. const int N=;
  44. //Code begin...
  45.  
  46. struct Edge{int p, next, w;}edge[];
  47. int head[], cnt=, s, t, vis[];
  48. char s1[][], s2[][];
  49. queue<int>Q;
  50.  
  51. void add_edge(int u, int v, int w)
  52. {
  53. edge[cnt].p=v; edge[cnt].next=head[u]; edge[cnt].w=w; head[u]=cnt++;
  54. edge[cnt].p=u; edge[cnt].next=head[v]; edge[cnt].w=; head[v]=cnt++;
  55. }
  56. int bfs(void)
  57. {
  58. int i, v;
  59. mem(vis,-);
  60. while (!Q.empty()) Q.pop();
  61. vis[s]=; Q.push(s);
  62. while (!Q.empty()) {
  63. v=Q.front(); Q.pop();
  64. for (i=head[v]; i; i=edge[i].next) {
  65. if (edge[i].w> && vis[edge[i].p]==-) {
  66. vis[edge[i].p]=vis[v] + ;
  67. Q.push(edge[i].p);
  68. }
  69. }
  70. }
  71. return vis[t]!=-;
  72. }
  73. int dfs(int x, int low)
  74. {
  75. int i, a, temp=low;
  76. if (x==t) return low;
  77. for (i=head[x]; i; i=edge[i].next) {
  78. if (edge[i].w> && vis[edge[i].p] == vis[x] + ){
  79. a=dfs(edge[i].p,min(edge[i].w,temp));
  80. temp-=a; edge[i].w-=a; edge[i^].w += a;
  81. if (temp==) break;
  82. }
  83. }
  84. if (temp==low) vis[x]=-;
  85. return low-temp;
  86. }
  87. int main ()
  88. {
  89. int n, m, d, sum=;
  90. scanf("%d%d%d",&n,&m,&d);
  91. FO(i,,n) scanf("%s",s1[i]+);
  92. FO(i,,n) scanf("%s",s2[i]+);
  93. s=, t=*n*m+;
  94. FO(i,,n) FOR(j,,m) {
  95. if (s1[i][j]!='') add_edge(i*m+j,i*m+j+n*m,s1[i][j]-'');
  96. if (s2[i][j]=='L') add_edge(s,i*m+j,), ++sum;
  97. if (i<d||(n--i)<d||j<=d||(m-j+)<=d) add_edge(i*m+j+n*m,t,INF);
  98. FO(k,,n) FOR(l,,m) {
  99. if (k==i&&l==j) continue;
  100. if (abs(k-i)+abs(l-j)<=d) add_edge(i*m+j+n*m,k*m+l,INF);
  101. }
  102. }
  103. int res=, temp;
  104. while (bfs()) while (temp=dfs(s,INF)) res+=temp;
  105. printf("%d\n",sum-res);
  106. return ;
  107. }

BZOJ 1066 蜥蜴(网络流)的更多相关文章

  1. BZOJ 1066 蜥蜴 最大流

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

  2. bzoj 1066 蜥蜴

    最大流. 建图:首先将每根柱子拆成两个点. 每根柱子的入点向出点连一条容量为柱子高度的边. 每根柱子的出点向可以到达的柱子的入点连一条容量为正无穷的边. 源点向每根初始有蜥蜴的柱子的入点连一条容量为一 ...

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

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

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

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

  5. bzoj 1066 : [SCOI2007]蜥蜴 网络流

    题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...

  6. AC日记——[SCOI2007]蜥蜴 bzoj 1066

    1066 思路: 网络流最大流: 拆点,每个点拆成两个,流量为这个点的高度: 注意,文中说的距离是曼哈顿距离(劳资以为开根号wa了不知道多少次): 每两个距离不大于d的点连边,流量inf: 如果距离能 ...

  7. BZOJ 1066 【SCOI2007】 蜥蜴

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

  8. BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴

    与POJ 1815 Friendship类似,该题之前也做过 目前处于TLE状态.样例已经通过 1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit:  ...

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

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

随机推荐

  1. Java设计模式(11)——结构型模式之享元模式(Flyweight)

    一.概述 概念 避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). UML简图 单纯享元模式 角色 抽象享元角色(Flyweight):定义享元子类公共接口 具体享元角色(Co ...

  2. 【转】odoo 10的企业微信发送程序介绍

    本文介绍的微信发送程序不是独立的模块,是某企业应用的一部分, 源码可在京津冀odoo技术交流群的群共享中下载.   [1]基本配置 在work.weixin.qq.com上注册一个企业后,会得到企业的 ...

  3. Installing python-ldap in Ubuntu

    These are the steps to be followed to install python-ldap in Ubuntu. At first, sudo apt-get install ...

  4. 北京Uber优步司机奖励政策(1月28日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  5. 成都Uber优步司机奖励政策(3月20日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. HDU 4418 Time travel

    Time travel http://acm.hdu.edu.cn/showproblem.php?pid=4418 分析: 因为走到最后在折返,可以将区间复制一份,就变成了只往右走,01234321 ...

  7. Python之celery

    一.celery简介 Celery是一个Python开发的异步分布式任务调度模块.celery本身不提供消息服务,使用第三方服务,也就是borker来传递任务,目前支持rebbing, redis, ...

  8. HTTP与IIS知识点

    HTTP TCP/IP 使用的网络是在TCP/IP协议族的基础上运作的.HTTP属于它内部的一个子集. 协议:计算机与设备要互相通信,双方就必须基于相同的方法.这种规则称为协议(protocol) 分 ...

  9. Spring学习记录-Java 11运行eureka-server报javax.xml.bind.JAXBContext not present错

    在pom.xml加入依赖就行 <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId&g ...

  10. Selenium(Python)生成Html测试报告

    由于Python3已经不支持HTMLTestRunner了, 无论是PyCharm还是pip都无法安装成功, 所以只能去 http://tungwaiyip.info/software/HTMLTes ...