描述

  在一个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. 郭盛华现身北京机场,颇有IT男的风范,网友:疑似被招安了

    郭盛华纵横互联网江湖数十年,他白手起家,凭着过人的勇敢.智慧和绝技,身经百战,显赫辉煌,成为中外闻名的互联网安全领域大师级人物. 郭盛华的网络技术指导方面经验丰富实力深厚.他是中国互联网安全领域的传奇 ...

  2. vue-element添加修改密码弹窗

    1.新建修改密码vue文件CgPwd.vue 代码如下: <template> <!-- 修改密码界面 --> <el-dialog :title="$t('c ...

  3. python数据探索与数据与清洗概述

    数据探索的核心: 1.数据质量分析(跟数据清洗密切联系,缺失值.异常值等) 2.数据特征分析(分布.对比.周期性.相关性.常见统计量等) 数据清洗的步骤: 1.缺失值处理(通过describe与len ...

  4. Python---进阶---常用模块os、jso

    一.写一个6位随机验证码程序(使用 random模块),要求验证码中至少包含一个数字.一个小写字母.一个大写字母 import randomimport string #help(string) co ...

  5. IDEA maven 配置,运行比较慢,加截本地仓库资源数据

    在 Runner 配置了参数: -DarchetypeCatalog=internal

  6. Ajax中浏览器的缓存问题解决方法

    我们在做项目中,一般提交请求都会通过ajax来提交,但是测试的时候发现,每次提交后得到的数据都是一样的,调试可以排除后台代码的问题,所以问题肯定是出在前台 每次清除缓存后,就会得到一个新的数据,所以归 ...

  7. CF D. Labyrinth 01BFS

    由于上下走不限制,所以按照贪心,我们应该尽可能走上下方向. 我们可以开一个双端队列,并认为每次提取队首的时候得到的是到达该点的最优策略.(这个一定是唯一的,因为不可能向右走几格,然后再退回去. ) 那 ...

  8. 软件工程 in MSRA Code Search-第二次结对编程

    重现基线模型 我们选择了 code2vec 模型进行复现.该模型由 Uri Alon 等作者于 2018 年提出. 模型思路: 从代码与普通语言相比的特殊性入手,首先,对于输入的代码段,作者考虑到尽管 ...

  9. 【BZOJ2460】元素(拟阵)

    题意:给定n个物品,每个物品有属性x和价值y,要求从中选出一些使得价值和最大并且其中没有属性xor和为0的非空子集 n<=1000,x<=1e18,y<=1e4 思路:没有xor和为 ...

  10. Android 获取屏幕尺寸与密度(转载)

    android中获取屏幕的长于宽,参考了网上有很多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533 结果很不靠谱,于是自己写了几行代码,亲测一 ...