题目链接:

https://www.luogu.org/problemnew/show/P2472

分析:

这道题用最大流解决。

首先构建模型。

一根柱子可以跳入和跳出,于是拆成两个点:入点和出点。

每一根柱子的入点和出点连一条流量为高度的边,来限制蜥蜴跳入的次数。

当柱子a可以调到柱子b时,就从a的出点向b的入点连边,流量inf。

S向所有有蜥蜴的柱子的入点连边,流量为1

T表示地图外一点,当一根柱子能跳到地图外时,则出点向T连流量为inf的边。

然后跑最大流即可。

这里要注意数组的范围以及拆点。

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<vector>
  5. #include<iostream>
  6. #define inf 0x7fffffff
  7. using namespace std;
  8. int s,t,ans;
  9. int d[1005];
  10. struct edge
  11. {
  12. int to,val,rev;
  13. edge(int _to,int _val,int _rev)
  14. {
  15. to=_to;
  16. val=_val;
  17. rev=_rev;
  18. }
  19. };
  20. vector<edge>e[1005];
  21. void add(int x,int y,int w)
  22. {
  23. e[x].push_back(edge(y,w,e[y].size()));
  24. e[y].push_back(edge(x,0,e[x].size()-1));
  25. }
  26. bool bfs()
  27. {
  28. memset(d, -1, sizeof(d));
  29. queue<int> q;
  30. q.push(s);
  31. d[s]=0;
  32. while(!q.empty())
  33. {
  34. int x=q.front();
  35. q.pop();
  36. for(int i=0;i<e[x].size();i++)
  37. {
  38. int y=e[x][i].to;
  39. if(d[y]==-1 && e[x][i].val)
  40. {
  41. q.push(y);
  42. d[y]=d[x]+1;
  43. }
  44. }
  45. }
  46. if(d[t]==-1)
  47. return 0;
  48. else
  49. return 1;
  50. }
  51. int dfs(int x,int low)
  52. {
  53. if(x==t || low==0)
  54. return low;
  55. int totflow=0;
  56. for(int i=0;i<e[x].size();i++)
  57. {
  58. int y=e[x][i].to;
  59. int rev=e[x][i].rev;
  60. if(d[y]==d[x]+1 && e[x][i].val)
  61. {
  62. int a=dfs(y,min(low,e[x][i].val));
  63. e[x][i].val-=a;
  64. e[y][rev].val+=a;
  65. low-=a;
  66. totflow+=a;
  67. if(low==0)
  68. return totflow;
  69. }
  70. }
  71. if(low!=0)
  72. d[x]=-1;
  73. return totflow;
  74. }
  75. void dinic()
  76. {
  77. while(bfs())
  78. {
  79. ans+=dfs(s,inf);
  80. }
  81. }
  82. int main()
  83. {
  84. int n,m,c,cnt=0;
  85. char ss;
  86. scanf("%d%d%d",&n,&m,&c);
  87. s=0,t=n*m*2+1;
  88. for(int i=1;i<=n;i++)
  89. {
  90. for(int j=1;j<=m;j++)
  91. {
  92. cin>>ss;
  93. if(ss>'0')
  94. {
  95. add((i-1)*m+j,(i-1)*m+j+n*m,ss-'0');
  96. }
  97. }
  98. }
  99. for(int i=1;i<=n;i++)
  100. {
  101. for(int j=1;j<=m;j++)
  102. {
  103. cin>>ss;
  104. if(ss=='L')
  105. {
  106. add(s,(i-1)*m+j,1);
  107. cnt++;
  108. }
  109. }
  110. }
  111. for(int i=1;i<=n;i++)
  112. {
  113. for(int j=1;j<=m;j++)
  114. {
  115. if(i+c>n||i-c<1||j+c>m||j-c<1)
  116. {
  117. add((i-1)*m+j+n*m,t,inf);
  118. }
  119. }
  120. }
  121. for(int x1=1;x1<=n;x1++)
  122. {
  123. for(int y1=1;y1<=m;y1++)
  124. {
  125. for(int x2=1;x2<=n;x2++)
  126. {
  127. for(int y2=1;y2<=m;y2++)
  128. {
  129. if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<=c*c)
  130. {
  131. add((x1-1)*m+y1+n*m,(x2-1)*m+y2,inf);
  132. }
  133. }
  134. }
  135. }
  136. }
  137. dinic();
  138. printf("%d",cnt-ans);
  139. return 0;
  140. }

洛谷P2472 [SCOI2007]蜥蜴 题解的更多相关文章

  1. [洛谷P2472] [SCOI2007]蜥蜴

    题目链接: 蜥蜴 题目分析: 一道网络流,先来分析一下问题: 在一个\(r*c\)的图中分布了一些数,其他地方都用\(0\)填充,我们分别从指定的一些数出发,每次可以移动到周围距离为\(d\)以内的数 ...

  2. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  3. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  4. P2472 [SCOI2007]蜥蜴(网络流)

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

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

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

  6. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

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

    题目 P2472 [SCOI2007]蜥蜴 解析 这个题思路比较清晰,本(qi)来(shi)以(jiu)为(shi)无脑建图跑最大流,结果挂了,整了一个小时后重新建图才过的. 建立一个超级源点和一个超 ...

  8. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  9. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

随机推荐

  1. Perl Scripts / 脚本

    树状递归列出目录下面子目录和文件 #!/usr/bin/perl #List all files and sub-directories as tree #Under current director ...

  2. Delphi访问活动目录(使用COM,活动目录Active Directory是用于Windows Server的目录服务)

    活动目录Active Directory是用于Windows Server的目录服务,它存储着网络上各种对象的有关信息,并使该信息易于管理员和用户查找及使用.Active Directory使用结构化 ...

  3. OpenSSL所有版本的变化,从1.1开始架构有所变化,生成的lib名称也有所不同了,以及对Qt的影响

    The complete explanation is that 1.0.x and 1.1.x do not have the same naming conventions for the gen ...

  4. ZooKeeper+Dubbo+SpringBoot 微服务Demo搭建

    1. 首先创建springBoot项目,springBoot是一堆组件的集合,在pom文件中对需要的组件进行配置.生成如下目录结构 创建test项目,同步在test创建dubbo-api,dubbo- ...

  5. linux-deployment

    官方 linux-deploymenthttp://doc.qt.io/qt-5/linux-deployment.html linuxdeployqthttps://github.com/probo ...

  6. Ruby元编程:动态添加类属性及其实际应用

    上个星期测试道的Monkey老师和我聊到测试用例参数过多的问题,其实这样的问题在我这里也同样经历过.比如我的测试用例必须面对不同的测试环境,每个环境有无数的参数,开发的最初阶段,因为参数少,所以就放在 ...

  7. Spark学习之路(十三)—— Spark Streaming 与流处理

    一.流处理 1.1 静态数据处理 在流处理之前,数据通常存储在数据库,文件系统或其他形式的存储系统中.应用程序根据需要查询数据或计算数据.这就是传统的静态数据处理架构.Hadoop采用HDFS进行数据 ...

  8. composer使用本地仓库

    { "repositories": { "sms": { "type": "path", "url" ...

  9. php对象在内存中创建于释放

    <?php /** * 1.对象的创建占用内存, * 对象内存释放,析构方法就是在对象释放前运行最后的一步.可以自动释放和手动释放 * 手动释放:通过unset($p);来释放对象,在这个时候会 ...

  10. Smobiler控件的使用:ListView的数据绑定及实现多选

    环境 SmobilerDesigner 4.7 Visual Studio 2010以上 正文 listview绑定数据 打开Visual Studio ,新建一个SmobilerApplicatio ...