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. Flask初级(八)flash与前台交互get post 简介

    Project name :Flask_Plan templates:templates static:static 两种 HTTP 请求方法:GET 和 POST在客户机和服务器之间进行请求-响应时 ...

  2. DevExpress v17.2—WPF篇(一)

    用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WPF v17.2 新的Hamburger Menu.Sched ...

  3. 【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法

    本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/1000.html ...

  4. 向ACCESS数据库中的表导入EXCEL表,在 System.Data.OleDb.OleDbException 中第一次偶然出现的“System.Data.dll”类型的异常

    向ACCESS数据库中的表导入EXCEL表,EXCEL表Sheet1中与ACCESS数据库表中的关键字对应的列的值,不能与数据库中表的主键项值重复,不然就会出现 在 System.Data.OleDb ...

  5. HDU 3376

    http://acm.hdu.edu.cn/showproblem.php?pid=3376 题意:一个矩阵,每个点有价值,起点左上角终点右下角,每次只能走当前点的下一点或右一点,从起点走到终点,再从 ...

  6. S3TC IAP15F2K61S2点亮一个发光二极管keil和stc-isp软件操作

    1.安装破解软件 2.打开STC-ISP,找到头文件,选择保存文件 3.找到keil的安装目录,keil/C51/INC 并保存 4.在桌面新建文件夹 5.打开keil 6.找到在桌面上新建的文件夹 ...

  7. FreeModbus undefined reference to `pthread_create'

    /********************************************************************************* * FreeModbus unde ...

  8. 学会从后往前遍历,例 [LeetCode] Pascal's Triangle II,剑指Offer 题4

    当我们需要改变数组的值时,如果从前往后遍历,有时会带来很多麻烦,比如需要插入值,导致数组平移,或者新的值覆盖了旧有的值,但旧有的值依然需要被使用.这种情况下,有时仅仅改变一下数组的遍历方向,就会避免这 ...

  9. chapter02 svm对手写体数字的数码图像进行识别

    #coding=utf8 # 从sklearn.datasets里导入手写体数字加载器. from sklearn.datasets import load_digits # 从sklearn.cro ...

  10. 20分钟打造你的Bootstrap站点

    来源:http://www.w3cplus.com/css/twitter-bootstrap-tutorial.html 特别声明:此篇文章由白牙根据Leon Revill的英文文章原名<Tw ...