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. 【Coursera】支持向量机

    一.最大间隔分类器 1. 函数间隔:\(γ^{i} = y^{i}(w^{T} x + b)\), 改变w和b的量级,对分类结果不会产生任何影响,但是会改变函数间隔的大小.因此,直接对函数间隔求最大值 ...

  2. springboot maven

    更多信息请从官网获取https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE 1.parent基于自己项目而非spring-boot-starter- ...

  3. 汇编语言段和RSEG用法

    RSEG是段选择指令,要想明白它的意思就要了解段的意思.段是程序代码或数据对象的存储单位.程序代码放到代码段,数据对象放到数据段.段分两种,一是绝对段,一是再定位段.绝对段在汇编语言中指定,在用L51 ...

  4. Linux操作系统(二)

    SSD工作原理:http://www.360doc.com/content/15/0318/15/16824943_456186965.shtml HHD工作原理:http://blog.csdn.n ...

  5. 6/4 sprint2 看板和燃尽图的更新

  6. oracle greatest(),least( ) ,coalesce()

    --场景1: select pt, greatest(wm), least(wm) from (select s.producttype pt, wm_concat(s.productid) wm f ...

  7. mysql 数据到 导入导出 总结

    数据库数据的导入和导出受secure_file_priv配置项影响#限制导入导出,null时无法进行数据的导入导出,空时不限制,设置了目录则只能对该目录下的文件进行导入导出show variables ...

  8. springMVC 访问静态资源

    问题描述 使用SpringMVC时遇到静态资源无法加载的问题,报404 问题原因 如果SpringMVC的映射模式采用的是后缀名匹配,如[*.do]或者[*.action]则不会出现该问题,因为静态资 ...

  9. BZOJ3107 CQOI2013二进制A+B(动态规划)

    显然答案只与a.b.c中各自1的个数及位数有关.a.b只考虑前i位怎么填时,c最多在第i+1位上为1,而第i+1位及之后的a.b怎么填都不会对前i位造成影响.于是设f[n][i][j][k][0/1] ...

  10. BZOJ3252 攻略(贪心+dfs序+线段树)

    考虑贪心,每次选价值最大的链.选完之后对于链上点dfs序暴力修改子树.因为每个点最多被选一次,复杂度非常正确. #include<iostream> #include<cstdio& ...