http://www.lydsy.com/JudgeOnline/problem.php?id=1066

每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边

如果第i根柱子有蜥蜴,S向i<<1连边,流量为1

如果第i根柱子能跳出去,i<<1|1向T连边,流量为inf

如果第i根柱子能跳到第j根柱子,i<<1|1向j<<1连边,流量为inf

至于每根柱子每个时刻只能有一个蜥蜴,不需要管,总可以通过先后顺序调整成满足条件

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6.  
  7. using namespace std;
  8.  
  9. #define N 900
  10. #define M 21500
  11.  
  12. const int inf=1e9;
  13.  
  14. char s[];
  15. int mp[][];
  16.  
  17. int cnt;
  18. int id[][];
  19.  
  20. int tot=;
  21. int front[N],nxt[M<<],to[M<<],val[M<<],from[M<<];
  22. int lev[N],num[N];
  23. int path[N];
  24. int cur[N];
  25.  
  26. int src,decc;
  27.  
  28. void add(int u,int v,int w)
  29. {
  30. to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; from[tot]=u; val[tot]=w;
  31. to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; from[tot]=v; val[tot]=;
  32. //cout<<u<<' '<<v<<' '<<w<<'\n';
  33. }
  34.  
  35. bool bfs()
  36. {
  37. queue<int>q;
  38. for(int i=src;i<=decc;++i) lev[i]=decc;
  39. q.push(decc);
  40. lev[decc]=;
  41. int now,t;
  42. while(!q.empty())
  43. {
  44. now=q.front();
  45. q.pop();
  46. for(int i=front[now];i;i=nxt[i])
  47. {
  48. t=to[i];
  49. if(lev[t]==decc && val[i^])
  50. {
  51. lev[t]=lev[now]+;
  52. q.push(t);
  53. }
  54. }
  55. }
  56. return lev[src]!=decc;
  57. }
  58.  
  59. int augment()
  60. {
  61. int now=decc,flow=inf;
  62. int i;
  63. while(now!=src)
  64. {
  65. i=path[now];
  66. flow=min(flow,val[i]);
  67. now=from[i];
  68. }
  69. now=decc;
  70. while(now!=src)
  71. {
  72. i=path[now];
  73. val[i]-=flow;
  74. val[i^]+=flow;
  75. now=from[i];
  76. }
  77. return flow;
  78. }
  79.  
  80. int isap()
  81. {
  82. int flow=;
  83. if(!bfs()) return ;
  84. memset(num,,sizeof(num));
  85. for(int i=src;i<=decc;++i) num[lev[i]]++,cur[i]=front[i];
  86. int now=src,t;
  87. while(lev[src]<decc)
  88. {
  89. if(now==decc)
  90. {
  91. flow+=augment();
  92. now=src;
  93. }
  94. bool advanced=false;
  95. for(int i=cur[now];i;i=nxt[i])
  96. {
  97. t=to[i];
  98. if(lev[t]==lev[now]- && val[i])
  99. {
  100. advanced=true;
  101. path[t]=i;
  102. cur[now]=i;
  103. now=t;
  104. break;
  105. }
  106. }
  107. if(!advanced)
  108. {
  109. int mi=decc;
  110. for(int i=front[now];i;i=nxt[i])
  111. if(val[i]) mi=min(mi,lev[to[i]]);
  112. if(!--num[lev[now]]) break;
  113. num[lev[now]=mi+]++;
  114. cur[now]=front[now];
  115. if(now!=src) now=from[path[now]];
  116. }
  117. }
  118. return flow;
  119. }
  120.  
  121. int main()
  122. {
  123. int n,m,k;
  124. scanf("%d%d%d",&n,&m,&k);
  125. for(int i=;i<=n;++i)
  126. {
  127. scanf("%s",s+);
  128. for(int j=;j<=m;++j)
  129. {
  130. mp[i][j]=s[j]-'';
  131. if(mp[i][j]) id[i][j]=++cnt;
  132. }
  133. }
  134. src=; decc=(cnt<<|)+;
  135. int x,y;
  136. for(int i=;i<=n;++i)
  137. for(int j=;j<=m;++j)
  138. {
  139. if(!mp[i][j]) continue;
  140. add(id[i][j]<<,id[i][j]<<|,mp[i][j]);
  141. for(int r=;r<=n;++r)
  142. for(int c=;c<=m;++c)
  143. {
  144. if(!mp[r][c] || (r==i && c==j)) continue;
  145. if((r-i)*(r-i)+(c-j)*(c-j)<=k*k) add(id[i][j]<<|,id[r][c]<<,mp[i][j]);
  146. //if(abs(r-i)+abs(c-j)<=k) add(id[i][j]<<1|1,id[r][c]<<1,inf);
  147. }
  148. if(i<=k || j<=k || n-i<k || m-j<k) add(id[i][j]<<|,decc,inf);
  149. }
  150. int sum=;
  151. for(int i=;i<=n;++i)
  152. {
  153. scanf("%s",s+);
  154. for(int j=;j<=m;++j)
  155. {
  156. if(s[j]=='L')
  157. {
  158. sum++;
  159. add(src,id[i][j]<<,);
  160. }
  161. }
  162. }
  163. cout<<sum-isap();
  164. }

1066: [SCOI2007]蜥蜴

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 4407  Solved: 2245
[Submit][Status][Discuss]

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

bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  6. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  7. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  8. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  9. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

随机推荐

  1. 第三个spirit(第十四天)

    一 .进度(自习室) 本来十号要开始进行第三次冲刺,不过因为团队很多成员要进行协会和组织的换届,而且团队还换了新 人又加了人进来,所以我们今天才是第三次冲刺的第一天.我们进行了新团队的第一次会议.基于 ...

  2. angularJS1笔记-(7)-控制器的合理使用(显示和隐式的依赖注入)

    AngularJS依赖注入 1.隐式注入:不需要开发人员干预,angularJS自动根据参数的名称识别和注入数据 app.controller("myCtrl".function( ...

  3. beta 发布的相关评论

    1. 礼物挑选小工具 飞天小女警      这个项目的创意独具匠心,贴近实际,令人耳目一新,网站的页面也是玫红色的,配色让人感到很温馨,对礼物的筛选方式很有趣,使用的记录特殊日子的方法来提醒自己挑选礼 ...

  4. MiniUI合并单元格

    function onload(e){ var grid = e.sender; var len = grid.data.length; var data= grid.data; ,num=; var ...

  5. 【转载】Vue项目中的文件/文件夹命名规范

    文件或文件夹的命名遵循以下原则: index.js 或者 index.vue,统一使用小写字母开头的(kebab-case)命名规范 属于组件或类的,统一使用大写字母开头的(PascalCase)命名 ...

  6. [cnbeta] 波音系列飞机价格。。。

    https://www.cnbeta.com/articles/tech/786745.htm 单价最便宜的是波音737-700,为0.858亿美元(约合5.96亿元). 评论网友调侃,“你家能满40 ...

  7. MySql--学习成长过程

    MySql--学习成长过程 模拟测试: QQ数据库管理 一.创建数据库并添加关系和测试数据 1 ##创建QQ数据库,完成简单的测试 2 3 #创建数据库 4 DROP DATABASE IF EXIS ...

  8. 手写简单的promise

    function Promise(fn) { var that = this; this.status = "pedding"; this.value = undefined; / ...

  9. java中的变量各占得字节数

    boolen,8位1个字节int,32位,4个字节float,32位 4个字节double,64位8个字节char 16位,2个字节byte 8位1个字节short 16位 2个字节long 64位 ...

  10. 【比赛】NOIP2017 总结

    一.比赛过程 Day1: 拿到题目后,立即把所有题目都看了一遍,发现没有很虚的期望DP和概率DP,感到很庆幸.然后发现今年的题目顺序好像有点不对,T1是数论,T2像是模拟,这难道是把两天的基础题放到一 ...