Description

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

Input

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

Output

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

最大流

每条石柱拆成两个点,连边容量为石柱高度

在距离不超过d的石柱间连边,容量为inf

从源点连边到每条有蜥蜴的石柱,容量为1

从可以跳到图外的点连边到汇点,容量为inf

#include<cstdio>
#include<cstring>
struct edge{
int nx,w;
edge(){}
edge(int a,int b){
nx=a;
w=b;
}
}es[];
int ep=;
const int S=,T=,INF=;
int g[][],gp=;
int h[];
int v[][];
int q[];
int n,m,ans=,mx,ls=;
int ids[][],idp=;
int hs[][];
char c;
inline int min(int a,int b){return a<b?a:b;}
inline void addedge(int s,int t,int w){
es[ep]=edge(t,w);
g[gp][]=ep++;
g[gp][]=g[s][];
g[s][]=gp++;
es[ep]=edge(s,);
g[gp][]=ep++;
g[gp][]=g[t][];
g[t][]=gp++;
}
inline bool bfs(){
int qs=,qe=;
q[qe++]=S;
memset(h,-,sizeof h);
h[S]=;
while(qs<qe){
int w=q[qs++];
int i=w;
while(i=g[i][]){
int e=g[i][];
int u=es[e].nx;
if(h[u]!=-||!es[e].w)continue;
h[u]=h[w]+;
q[qe++]=u;
}
}
return h[T]!=-;
}
int dfs(int w,int f){
if(w==T)return f;
int i=w;
int used=,c;
while(i=g[i][]){
int e=g[i][];
int u=es[e].nx;
if(h[u]!=h[w]+||es[e].w==)continue;
c=f-used;
c=dfs(u,min(c,es[e].w));
es[e].w-=c;
es[e^].w+=c;
used+=c;
if(used==f)return f;
}
if(!used)h[w]=-;
return used;
}
char gc(){
char c=getchar();
while((c<''||c>'')&&c!='L'&&c!='.')c=getchar();
return c;
}
int main(){
scanf("%d%d%d",&n,&m,&mx);
for(int i=;i<n;i++)
for(int j=;j<m;j++)
ids[i][j]=idp++;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
c=gc();
hs[i][j]=c-'';
}
}
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(hs[i][j]>){
addedge(ids[i][j],ids[i][j]+n*m,hs[i][j]);
bool o=;
for(int x=-mx;x<=mx;x++){
for(int y=-mx;y<=mx;y++){
if(x*x+y*y>mx*mx)continue;
if(i+x<||i+x>=n||j+y<||j+y>=m){
o=;
continue;
}
if(hs[i+x][j+y]==)continue;
addedge(ids[i][j]+n*m,ids[i+x][j+y],INF);
}
}
if(o)addedge(ids[i][j]+n*m,T,INF);
}
}
}
for(int i=;i<n;i++){
for(int j=;j<m;j++){
c=gc();
if(c=='L')addedge(S,ids[i][j],),ls++;
}
}
while(bfs())ans+=dfs(S,INF);
printf("%d",ls-ans);
return ;
}

bzoj1066 蜥蜴的更多相关文章

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

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

  2. bzoj1066 蜥蜴 (dinic)

    最大流板子题. 对于每根柱子,建两个点ai,bi,建边(ai,bi,柱子高度) 对于距离不超过d的两根柱子i,j,建边(bi,aj,inf) 对于起始位置在i的每个蜥蜴,建边(S,ai,1) 对于能跳 ...

  3. 【蒟蒻の进阶PLAN】 置顶+持续连载

    看到周围神犇们纷纷列计划,本蒟蒻也决定跟随他们的步伐,计划大约是周计划吧,具体怎么安排我也不确定.. 2015.12.30 刚刚学习完最基础的网络流,需要进行这方面的练习,从简到难,有空余的话尝试学习 ...

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

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

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

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

  6. 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流

    [bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...

  7. [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴

    [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴 试题描述 在一个 \(r\) 行 \(c\) 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥 ...

  8. BZOJ1066 [SCOI2007]蜥蜴

    首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...

  9. [bzoj1066] [SCOI2007] 蜥蜴 - 网络流

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

随机推荐

  1. python关于时间的计算,time模块

    import time, datetime # time.time 返回当前时间的时间戳(1970纪元后经过的浮点秒数)(格林尼治时间). # 1分钟60秒,1小时3600秒,1天86400秒. pr ...

  2. BLE低功耗蓝牙关键技术解析与应用

    BLE基础知识 1.传统蓝牙的传输距离几十米到几百米不等,BLE 则规定为 100 米(实际上没有那么远,50米以内比较稳定,和设备发射功率有关) 2.为了实现极低的功耗,BLE 协议设计为:在不必要 ...

  3. C++设计模式之访问者模式

    简述 访问者模式(Visitor Pattern)表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 代码实现: // Visitor.cpp : ...

  4. 玩转X-CTR100 l STM32F4 l OLED显示-SSD1306无字库

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      OLED显示屏具有自发光特性,不需要背光, ...

  5. MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0(七)

    [周年庆]MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] MyEclipse支持Java EE技术(如JAX-WS和EJB 3.0),它们以功能包 ...

  6. mysql-5.6.17-win32安装

    下载免安装压缩文件http://dev.mysql.com/downloads/mysql/ 解压到自定义目录,我这里演示的是D:\wamp\mysql\   复制根目录下的my-default.in ...

  7. SWIFT中计算两个日期间隔多少小时

    SWIFT中如何计算两个日期间隔多少个小时,其实几句代码就可以搞定了,Very Easy,在Playground内输入以下代码 var date1 = "2015-06-26 8:15:10 ...

  8. Foundation--NSString , array and Dictionary

    一,NSString的创建 NSString*str=@" a string ";//直接创建一个字符串常量,这样创建出来的字符串不需要释放内存 NSLog(@"%@&q ...

  9. android复制包需要修改的几个地方

    1.要看什么情况,若是在同一个eclipse下,那么就需要修改包名.若不在的话,那就可以不用了. 2.这个app_name也是一样. 3.先说下情况,这是我修改好的.原本这个R的是引之前包的,必须要改 ...

  10. 前端jquery---表单验证

    重点: 1.表单的提交 2.触发blur事件 3.判断是否正确,提交与否 return False <!DOCTYPE html> <html lang="en" ...