描述

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

  每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。

输入

  输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。

输出

  输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。

 

提示

  【限制】 100%的数据满足:1<=r, c<=20, 1<=d<=3

题解

  这是一道网络流。

  先考虑如何建图:对于每根石柱,我们可以把它拆成两个点,中间连一条容量为其高度的边。对于每根石柱,我们再将它和与它距离不超过d的所有石柱连边,容量无限。对于每根能够跳出去的石柱,我们将它与汇点t相连。对于每根有蜥蜴的石柱,我们将源点s与它相连。这样我们就可以跑最大流了。放上代码:

#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define INF 0x3f3f3f3f
int r,c,d;
int num=,f[N];
struct node{
int u,v,w,nxt;
}e[N<<];
void add(int u,int v,int w){
e[++num]=(node){u,v,w,f[u]};f[u]=num;
e[++num]=(node){v,u,,f[v]};f[v]=num;
}
//build graph
int s,t,dis[N];
int bfs(){
queue<int>q;
memset(dis,-,sizeof(dis));
q.push(s);dis[s]=;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=f[u];i;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(w&&dis[v]==-){
dis[v]=dis[u]+;q.push(v);
if(v==t) return ;
}
}
}
return ;
}
int dfs(int u,int flow){
if(u==t||!flow) return flow;
int ret=;
for(int i=f[u];i;i=e[i].nxt){
int v=e[i].v;
if(e[i].w&&dis[v]==dis[u]+){
int w=dfs(v,min(e[i].w,flow));
if(!w) continue;
ret+=w;flow-=w;e[i].w-=w;e[i^].w+=w;
if(!flow) break;
}
}
if(!ret) dis[u]=-;
return ret;
}
int dinic(){
int mf=;
while(bfs()){mf+=dfs(s,INF);}
return mf;
}
//flow
int cnt,id[][][],mp[][];
char ch[];
int dist(int xx,int yy){return xx*xx+yy*yy;}
int ID(int i,int j){return (i-)*c+j;}
int main(){
scanf("%d%d%d",&r,&c,&d);s=;t=(r*c)<<|;
for(int i=;i<=r;i++){
scanf("%s",ch+);
for(int j=;j<=c;j++){
mp[i][j]=ch[j]-'';
id[i][j][]=ID(i,j);id[i][j][]=id[i][j][]+r*c;
if(mp[i][j]) add(id[i][j][],id[i][j][],mp[i][j]);
}
}
for(int i=;i<=r;i++){
scanf("%s",ch+);
for(int j=;j<=c;j++){if(ch[j]=='L') cnt++,add(s,id[i][j][],);}
}
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
if(!mp[i][j]) continue;
if(i<=d||j<=d||r-i+<=d||c-j+<=d) add(id[i][j][],t,INF);
for(int dx=-d;dx<=d;dx++){
int xx=i+dx;
if(xx<||xx>r) continue;
for(int dy=-d;dy<=d;dy++){
int yy=j+dy;
if(yy<||yy>c||!mp[xx][yy]||dist(xx-i,yy-j)>d*d) continue;
if(xx==i&&yy==j) continue;
add(id[i][j][],id[xx][yy][],INF);
}
}
}
}
printf("%d",cnt-dinic());
return ;
}

WOJ#1243 蜥蜴 lizard的更多相关文章

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

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

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

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

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

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

  4. 1066: [SCOI2007]蜥蜴

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

  5. bzoj 1066 蜥蜴

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

  6. BZOJ 1066 【SCOI2007】 蜥蜴

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

  7. 蜥蜴(bzoj 1066)

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

  8. WOJ -1204

    WOJ -1204 1 出现次数大于一半 那么就利用普通的堆栈的思想,如果删除两个不同的元素,原来的多数元素还是多数元素,所以采取按条件入栈的方法,如果和top元素相同则入栈,否则top--,此元素也 ...

  9. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...

随机推荐

  1. java:Conllection中的List,ArrayList添加元素,删除元素,输出元素

    java:Conllection中的List,ArrayList添加元素,删除元素,输出元素 //为list接口实例化 List<String> addlist = new ArrayLi ...

  2. java:在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作

    在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作 //在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作 List<String> a ...

  3. [原创]PHP代码修正之CodeSniffer

    目录 参考链接 介绍 安装 使用 命令行模式 PHPStorm 让编辑器使用PSR-2标准 集成phpcbf 参考链接 PHP开发规范之使用phpcbf脚本自动修正代码格式 在PhpStorm中使用P ...

  4. 【leetcode】1129. Shortest Path with Alternating Colors

    题目如下: Consider a directed graph, with nodes labelled 0, 1, ..., n-1.  In this graph, each edge is ei ...

  5. SonarQube规则之bug类型

    1.".equals()" should not be used to test the values of "Atomic" classes.bug 主要不要 ...

  6. mysql Update语句 语法

    mysql Update语句 语法 作用:用于修改表中的数据.广州大理石机械构件 语法:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 mysql Update语句 示例 ...

  7. Element ui 中的表单提交按钮多次点击bug修复

  8. Java——常用类(StringBuffer)

    [StringBuffer]   <1>java.lang.StringBuffer代表可变的字符序列. <2>StringBuffer和String类似,但是StringBu ...

  9. 简单的LCA

    这么久了才做LCA的题,以前是感觉很难不敢去尝试,现在学习了一番之后发现算法本身并不难.... 学习时看了这篇博文:https://www.cnblogs.com/JVxie/p/4854719.ht ...

  10. Acvitivi网关(十一)

    1排他网关 1.1 什么是排他网关 排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策. 当流程执行到这个网关,所有分支都会判断条件是否为 true,如果为 true 则 ...