学弟@lher在周末训练赛中出的题目的原题(这个人拿省选题来当作提高组模拟,太丧了。。。)

题意简析:看题目:)

解题思路:题目显然是最大流。

首先拆点将点权变为边权,然后按照题意对于所有有跳板的点向可以跳到的点连一条权值为inf的边,对于能够跳出地图边界的点,将它与汇点连一条权值为inf的边。对于有蜥蜴的点,从源点向这个点连一条权值为1的边,然后跑一次最大流,答案就是蜥蜴数-最大流。

AC代码:

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<string>
  6. #include<algorithm>
  7. #define ll long long
  8. #define inf 0x7fffffff
  9. using namespace std;
  10. struct zxy{
  11. int next,to,v;
  12. }edge[];
  13. int n,m,d,head[],iter[],lev[],que[],cnt=,mz=;
  14. bool b[][];
  15. inline int getno(int x,int y){ return (x-)*m+y;}
  16. inline int getdis(int x,int y,int a,int b){ return ceil(sqrt((x-a)*(x-a)+(y-b)*(y-b)));}
  17. inline void ins(int x,int y,int l){edge[++cnt].next=head[x],head[x]=cnt,edge[cnt].to=y,edge[cnt].v=l;}
  18. inline int in(){
  19. int x=,f=;
  20. char ch=getchar();
  21. while(ch<''||ch>'') {if(ch=='-') f=-; ch=getchar();}
  22. while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  23. return x*f;
  24. }
  25. inline bool bfs(int s,int e){
  26. memset(lev,-,sizeof(lev));
  27. int t=,h=;
  28. que[]=s;
  29. lev[s]=;
  30. do{
  31. h++;
  32. int k=head[que[h]];
  33. while(k){
  34. if (lev[edge[k].to]==-&&edge[k].v){
  35. lev[edge[k].to]=lev[que[h]]+;
  36. que[++t]=edge[k].to;
  37. }
  38. k=edge[k].next;
  39. }
  40. }while(h<t);
  41. return lev[e]!=-;
  42. }
  43. inline int dfs(int u,int v,int f){
  44. if (u==v) return f;
  45. int used=,k=head[u];
  46. while(k){
  47. if (edge[k].v&&lev[edge[k].to]==lev[u]+){
  48. int w=dfs(edge[k].to,v,min(edge[k].v,f-used));
  49. used+=w;
  50. edge[k].v-=w;
  51. edge[k^].v+=w;
  52. if (used==f) return used;
  53. }
  54. k=edge[k].next;
  55. }
  56. return used;
  57. }
  58. int dinic(int s,int t){
  59. int flow=;
  60. while(bfs(s,t))
  61. flow+=dfs(s,t,inf);
  62. return flow;
  63. }
  64. void init(){
  65. n=in(),m=in(),d=in();
  66. for (int i=; i<=n; ++i){
  67. for (int j=; j<=m; ++j){
  68. int x=getchar()-'',no=getno(i,j);
  69. if (x) ins(no,no+n*m,x),ins(no+n*m,no,),b[i][j]=;
  70. }
  71. getchar();
  72. }
  73. for (register int i=; i<=n; ++i){
  74. for(register int j=; j<=m; ++j)
  75. if (getchar()=='L') ++mz,ins(,getno(i,j),),ins(getno(i,j),,);
  76. getchar();
  77. }
  78. for (register int i=; i<=n; ++i)
  79. for (register int j=; j<=m; ++j)
  80. if(b[i][j]){
  81. if (i-d<||i+d>n||j-d<||j+d>m) ins(getno(i,j)+n*m,n*m*+,inf),ins(n*m*+,getno(i,j)+n*m,);
  82. for (int k=(i-d<?:i-d); k<=(i+d>n?n:i+d); ++k)
  83. for (int t=(j-d<?:j-d); t<=(j+d>m?m:j+d); ++t)
  84. if (b[k][t]&&getdis(i,j,k,t)<=d&&(i!=k||j!=t))
  85. ins(getno(i,j)+n*m,getno(k,t),inf),ins(getno(k,t),getno(i,j)+n*m,);
  86. }
  87. }
  88. int main(){
  89. init();
  90. printf("%d",mz-dinic(,*n*m+));
  91. return ;
  92. }

本文由Melacau编写,Melacau代表M星向您问好,如果您不是在我的博客http://www.cnblogs.com/Melacau上看到本文,请您向我联系,email:13960948839@163.com.

【网络流】【BZOJ1006】【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. P2472 [SCOI2007]蜥蜴(网络流)

    P2472 [SCOI2007]蜥蜴 把每个点拆成2个点,两点之间连边的边权为石柱高度 新建虚拟源点$S$和汇点$T$ $S$向所有有蜥蜴的点连边,边权1 其他边都连$inf$ 剩下就是裸的$dini ...

  3. BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】

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

  4. 题解 P2472 【[SCOI2007]蜥蜴】

    P2472 [SCOI2007]蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱 ...

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

    [SCOI2007] 蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1 ...

  6. P2472 [SCOI2007]蜥蜴(最大流)

    P2472 [SCOI2007]蜥蜴 自己第一道独立做题且一遍AC的网络流题纪念... 看到这道题我就想到网络流建图的方式了... 首先根据每个高度,我们将每个点拆成两个点限流.之后根据跳的最大距离, ...

  7. 1066: [SCOI2007]蜥蜴

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

  8. BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴

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

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

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

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

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

随机推荐

  1. python控制流 If-else

        控制流 If-else 我们处理现实生活中的问题时会做出决定,就像决定买哪种相机或者怎样更好的打篮球.同样我们写计算机程序的时候也要做相同的事情.我们通过 if-else 语句来做决定,我们使 ...

  2. io多路复用(一)

    sever端 1 import socket sk1 = socket.socket() sk1.bind(('127.0.0.1',8001,)) sk1.listen() sk2 = socket ...

  3. AWS EC2服务器的HTTPS负载均衡器配置过程

    AWS EC2服务器配置负载均衡器步骤:   1.普通负载均衡器   至少两台EC2实例,这里以Centos6.7系统为例 启动之后先安装个apache的httpd服务器默认80端口,或者使用其他服务 ...

  4. TOTP算法 基于时间的一次性密码

    /** Copyright (c) 2011 IETF Trust and the persons identified as authors of the code. All rights rese ...

  5. .NET Core装饰模式和.NET Core的Stream

    该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...

  6. faster-rcnn 结构杂谈

    faster-rcnn结构图: (只截取了最难理解的部分) 这个网络看似很复杂,但是理解了其中关键的层,就基本可以掌握这个结构了.要看源码!!要看源码!!要看源码 !!重要的事情说三遍. 关键的层: ...

  7. Gson解析Json数组

    需求:从steam官网获取英雄数据,即为Json数据,并导入到本地数据库 Json数据是这样的 { "result": { "heroes": [ { &quo ...

  8. LAMP 搭建

    p { margin-bottom: 0.25cm; line-height: 120% } LAMP 搭建 承 Ubuntu 17.10.1安装, 定制. 参考 电子工业出版社, Ubuntu完美应 ...

  9. WebApi 接口返回值类型详解 ( 转 )

    使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分 ...

  10. Vue.js和jQuery混合使用的一点注意事项

    首先,Vue 的官方是不建议直接操作 DOM 的,其优势在于视图和数据的双向绑定,而且所有DOM操作都可以用Vue实现,反而使用jQuery来操作DOM的话,会造成不必要的麻烦,DOM未渲染完成之前事 ...