Description

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

Input

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

Output

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

Sample Input

5 8 2
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........

Sample Output

1

HINT

100%的数据满足:1<=r, c<=20, 1<=d<=4

辣鸡BZOJ……别的OJ都A了就它A不了……
一开始看到高度不超过三,以为是什么炒鸡神奇的拆点操作……
后来想不出来神奇的拆点操作
就随便把点拆成了一个入点一个出点
两点间的容量为柱子的高度
再增设一个超级源点0和各个起点链接,容量为1(1只蜥蜴)
然后其他的边就全部INF好了……
瞎搞搞就过了

UPDATE:改过了……luogu不加优化0ms,BZOJ加了优化还88ms……emmm……

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define MAXM (1000000+10)
#define MAXN (100000+10)
using namespace std; struct node
{
int Flow;
int next;
int to;
} edge[MAXM*];
int Depth[MAXN],q[MAXN];
int head[MAXN],num_edge;
int n,m,s,e,d,INF;
int a[][];
char ch; void add(int u,int v,int l)
{
edge[++num_edge].to=v;
edge[num_edge].Flow=l;
edge[num_edge].next=head[u];
head[u]=num_edge;
} bool Bfs(int s,int e)
{
int Head=,Tail=;
memset(Depth,,sizeof(Depth));
Depth[s]=;
q[]=s;
while (Head<Tail)
{
++Head;
int x=q[Head];
for (int i=head[x]; i!=; i=edge[i].next)
if (!Depth[edge[i].to] && edge[i].Flow>)
{
Depth[edge[i].to]=Depth[x]+;
q[++Tail]=edge[i].to;
}
}
if (Depth[e]>) return true;
return false;
} int Dfs(int x,int low)
{
int Min,f=;
if (x==e || low==)
return low;
for (int i=head[x]; i!=; i=edge[i].next)
if (edge[i].Flow> && Depth[edge[i].to]==Depth[x]+ && (Min=Dfs(edge[i].to , min(low,edge[i].Flow) )))
{
edge[i].Flow-=Min;
edge[((i-)^)+].Flow+=Min;
f+=Min;
low-=Min;
if (low==) break;
}
if (!f) Depth[x]=-;
return f;
} int Dinic(int s,int e)
{
int Ans=;
while (Bfs(s,e))
Ans+=Dfs(s,0x7fffffff);
return Ans;
} int main()
{
s=,e=;
int Sum=;
memset(&INF,0x7f,sizeof(INF));
scanf("%d%d%d",&n,&m,&d);
for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j)
{
cin>>ch;
a[i][j]=ch-;
}
for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j)
{
add((i-)*m+j,(i-)*m+j+,a[i][j]);
add((i-)*m+j+,(i-)*m+j,a[i][j]);
}
for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j)
{
cin>>ch;
if (ch=='L')
{
++Sum;
add(,(i-)*m+j,);
add((i-)*m+j,,);
}
}
for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j)
if (a[i][j]!= && (i<=d || j<=d || m-j<d || n-i<d))
{
add((i-)*m+j+,,INF);
add(,(i-)*m+j+,);
}
for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j)
for (int k=; k<=n; ++k)
for (int l=; l<=m; ++l)
if (!(i==k && j==l) && a[i][j]!= && a[k][l]!= && sqrt((i-k)*(i-k)+(j-l)*(j-l))<=d)
{
add((i-)*m+j+,(k-)*m+l,INF);
add((k-)*m+l,(i-)*m+j+,);
}
printf("%d",Sum-Dinic(,));
}

1066. [SCOI2007]蜥蜴【最大流】的更多相关文章

  1. BZOJ 1066: [SCOI2007]蜥蜴( 最大流 )

    结点容量..拆点然后随便写 --------------------------------------------------------------- #include<cstdio> ...

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

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

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

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

  4. 1066: [SCOI2007]蜥蜴

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

  5. [SCOI2007] 蜥蜴 (最大流)

    [SCOI2007] 蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1 ...

  6. P2472 [SCOI2007]蜥蜴 (最大流)

    题目 P2472 [SCOI2007]蜥蜴 解析 这个题思路比较清晰,本(qi)来(shi)以(jiu)为(shi)无脑建图跑最大流,结果挂了,整了一个小时后重新建图才过的. 建立一个超级源点和一个超 ...

  7. 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...

  8. [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】

    题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 ...

  9. BZOJ 1066 [SCOI2007]蜥蜴(最大流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1066 [题目大意] 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些 ...

随机推荐

  1. springboot面试专题及答案

    声明:此文章非本人所 原创,是别人分享所得,如有知道原作者是谁可以联系本人,如有转载请加上此段话 问题一 什么是 Spring Boot? 多年来,随着新功能的增加,spring 变得越来越复杂.只需 ...

  2. Mac Supervisor 管理进程

    无论是在日常工作中还是平时玩代码中,我总是离不开 Supervisor,其实很久之前我就写过一篇文章:supervisord 部署 Flask,在里面,我仔细讲解了如何在 Linux 环境下安装并且配 ...

  3. Java8简明学习之Lambda表达式

    函数式接口 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以被隐式转换为lambda表达式. 之前已有的函数式接口: java.lang.Runnable java.uti ...

  4. nginx正确服务react-router应用

    如今React应用普遍使用react-router作为路由管理,在开发端webpack自带的express服务器下运行和测试表现均正常,部署到线上的nginx服务器后,还需要对该应用在nginx的配置 ...

  5. 基于express+mongodb+pug的博客系统——后台篇

    上一篇介绍了模板引擎pug.js的用法,这一篇就主要写后台逻辑了. 后台的大部分的功能都有了,只是在已经登录的状态下,前台和后台的逻辑处理还不是很完善. 先上几张图吧,仿旧版的简书,改了下UI,因为没 ...

  6. js获取url中参数名也参数值

    要撮利用js获取url中参数名也参数值这个不多见了,但我今天需要这样操作,下面我来给大家介绍一下具体的实例方法.   在已知参数名的情况下,获取参数值,使用正则表达式能很容易做到. js的实现方法如下 ...

  7. Flutter学习之制作底部菜单导航

    简介 现在我们的 APP 上面都会在屏幕下方有一排的按钮,点击不同的按钮可以进入不同的界面.就是说在界面的底部会有一排的按钮导航.可看下面的图示. 完成图示 程序工程目录 梳理下实现步骤我们需要实现这 ...

  8. 可执行文件patch技术&&持续更新

    前言 在ctf比赛中, 有时我们需要对可执行文件进行patch, 或者在植入后门时,patch也是常用的手段.不过手工patch比较麻烦,下面介绍几个工具.本文介绍遇到的各种技术,不断更新. ELF ...

  9. Material适配1 - 入门篇

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4493384.html 随着Material Design的普 ...

  10. 3D打印材料的发展现状(1)

    材料是3D打印的物质基础,也是当前制约3D打印发展的瓶颈. 3D打印材料 3D打印材料是3D打印技术发展的重要物质基础,材料的发展对于3D打印的发展有重要的作用. 目前,3D打印材料主要包括工程塑料. ...