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. html form method 属性不支持put,delete请求方式,以及开启spring mvc的rest的方式

    1.加上隐藏域解决form method 不支持put,delete的请求方式的问题 2.配置spring mvc HiddenHttpMethodFilter过滤器实现对put和delete请求方式 ...

  2. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

  3. > ch05-01

    这是<<shaders for game programmers and artists>> 第五章中第一个shader例子--RTT..一直没弄出结果,今天记下来,主要是操作 ...

  4. 相同类型的对象不能互相转换:java.lang.ClassCastException: com.anhoo.po.UserPo cannot be cast to com.anhoo.po.UserPo

    @PostMapping("/findone") public String getone(UserVo userVo) throws IllegalAccessException ...

  5. xml与json

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. JSON现在基本上作为前后端数据交互的重要载体,在JSON之前,前后端主要的传输方式主要是通过XML或者文 ...

  6. Tomcat学习之二:tomcat安装、配置及目录文件说明

    我们看到tomcat目录/bin文件夹里有个tomcat6w.exe,顾名思义就是tomcat以window方式显示控制台.第1次点击打开它时候,可能会提示:tomcat指定的服务未安装,此时我们可以 ...

  7. ORA-10922 Temporary tablespace group is empty错误

    错误--练习查询,发现报错: SQL>  select * from range_list_part_tab where id=100000Execution Plan------------- ...

  8. valgrind- 内存泄漏-how to install and use

    1.how to install my host computer is ARM, U need to Attention yours... valgrind下载: http://valgrind.o ...

  9. TX2平台CAN总线收发功能的测试

    前言 项目实现过程中需要将获取的数据信息通过CAN总线传输到控制规划模块,本文主要介绍如何在TX2平台测试CAN总线的收发功能. TX2是英伟达旗下为嵌入式平台人工智能应用开发出的一个硬件平台,TX1 ...

  10. DHT11

    主机开始发送信号:先拉低至少18ms,然后在拉高20~40us,然后DHT11响应, 拉低数据线40~50us,接着在拉高40~50us,之后再开始输出数据. 输出0是的时序:先12.14us低电平, ...