1066: [SCOI2007]蜥蜴

Time Limit: 1 Sec  Memory Limit: 162 MB

Submit: 2512  Solved: 1238

[Submit][Status][Discuss]

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

Source

<a href="http://www.lydsy.com/JudgeOnline/problemset.php?search=Pku%202711%20Leapin" lizards'="" style="color: blue; text-decoration: none;">Pku 2711 Leapin' Lizards

题目要求无法逃离的蜥蜴的最小值,即求能够逃离的蜥蜴的最大值。选择使用最大流。当然重点在构图。

对于每个石柱,我们能够拆成两个点。分别为入点和出点。

对于全部石柱。从入点到出点连边,容量为高度。这里等于限制了每个石柱的跳跃次数。

对于最初有蜥蜴的石柱。从源点向这些点的入点连边。容量为1。由于每个石柱仅仅有一个蜥蜴。

对于随意一对能够相互到达的石柱。分别从彼此的出点到入点连边,容量为正无穷。

等于如果能够有尽可能多的蜥蜴跳过。

对于能够跳到边界外的石柱,从出点向汇点连边。容量为正无穷。

原理同上。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<queue>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define LL long long
#define pa pair<int,int>
#define MAXN 1000
#define MAXM 100000
#define INF 1000000000
#define f1(x,y) ((x-1)*m+y)
#define f2(x,y) ((x-1)*m+y+m*n)
using namespace std;
int cnt=1,ans=0,s,t,n,m,d;
int head[MAXN],cur[MAXN],dis[MAXN],f[25][25];
char ch[25];
struct edge_type
{
int next,to,v;
}e[MAXM];
inline void add_edge(int x,int y,int v)
{
e[++cnt]=(edge_type){head[x],y,v};head[x]=cnt;
e[++cnt]=(edge_type){head[y],x,0};head[y]=cnt;
}
inline bool bfs()
{
queue<int>q;
while (!q.empty()) q.pop();
memset(dis,-1,sizeof(dis));
dis[s]=0;q.push(s);
while (!q.empty())
{
int tmp=q.front();q.pop();
if (tmp==t) return true;
for(int i=head[tmp];i;i=e[i].next) if (e[i].v&&dis[e[i].to]==-1)
{
dis[e[i].to]=dis[tmp]+1;
q.push(e[i].to);
}
}
return false;
}
inline int dfs(int x,int f)
{
int tmp,sum=0;
if (x==t) return f;
for(int &i=cur[x];i;i=e[i].next)
{
int y=e[i].to;
if (e[i].v&&dis[y]==dis[x]+1)
{
tmp=dfs(y,min(f-sum,e[i].v));
e[i].v-=tmp;e[i^1].v+=tmp;sum+=tmp;
if (sum==f) return sum;
}
}
if (!sum) dis[x]=-1;
return sum;
}
inline void dinic()
{
while (bfs())
{
F(i,1,t) cur[i]=head[i];
ans-=dfs(s,INF);
}
}
inline bool excape(int x,int y)
{
return min(min(x,n+1-x),min(y,m+1-y))<=d;
}
inline bool judge(int x1,int y1,int x2,int y2)
{
if (x1==x2&&y1==y2) return false;
return (f[x1][y1]&&f[x2][y2]&&((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))<=(d*d));
}
int main()
{
scanf("%d%d%d",&n,&m,&d);s=2*n*m+1;t=s+1;
F(i,1,n)
{
scanf("%s",ch);
F(j,1,m) f[i][j]=ch[j-1]-'0';
}
F(i,1,n)
{
scanf("%s",ch);
F(j,1,m) if (ch[j-1]=='L'){add_edge(s,f1(i,j),1);ans++;}
}
F(i,1,n) F(j,1,m) if (f[i][j])
{
add_edge(f1(i,j),f2(i,j),f[i][j]);
if (excape(i,j)) add_edge(f2(i,j),t,INF);
}
F(i,1,n) F(j,1,m) F(ti,max(1,i-d),min(n,i+d)) F(tj,max(1,j-d),min(m,j+d))
if (judge(i,j,ti,tj)) add_edge(f2(i,j),f1(ti,tj),INF);
dinic();
printf("%d\n",ans);
}

bzoj1066【SCOI2007】蜥蜴的更多相关文章

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

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

  2. bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边 如果 ...

  3. bzoj1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...

  4. BZOJ1066 [SCOI2007]蜥蜴

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

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

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

  6. BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP

    由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html

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

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

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

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

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

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

  10. 【bzoj1066】【luogu2472】[SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MB Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上 ...

随机推荐

  1. xml中单词下面有提示下划线

    xml中单词下面有提示下划线,表示单词拼写错误或者大小写错误

  2. 使用vue实现简单键盘,支持移动端和pc端

    常看到各种app应用中使用自定义的键盘,本例子中使用vue2实现个简单的键盘,支持在移动端和PC端使用,欢迎点赞,h5 ios输入框与键盘 兼容性优化 实现效果: Keyboard.vue <t ...

  3. 紫书 习题 8-16 UVa 1618 (中途相遇法)

    暴力n的四次方, 然而可以用中途相遇法的思想, 分左边两个数和右边两个数来判断, 最后合起来判断. 一边是n平方logn, 合起来是n平方logn(枚举n平方, 二分logn) (1)两种比较方式是相 ...

  4. 上海交大课程MA430-偏微分方程续论(索伯列夫空间)之总结(Sobolev Space)

    我们所用的是C.L.Evans "Partial Differential Equations" $\def\dashint{\mathop{\mathchoice{\,\rlap ...

  5. 【Henu ACM Round#24 D】Iterated Linear Function

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把B提取出来就是一个等比数列了. 求和一下会发现是这种形式. \(B*\frac{(A^n-1)}{A-1}+A^n*x\) 则求一 ...

  6. OpenJudge 1031 Lausanne Capitale Olympique

    Lausanne Capitale Olympique Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on  ...

  7. hdoj-1212-Big Number【大数取余&amp;简单题】

    Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  8. Spring MVC 的 研发之路 (二)

    二.web.xml的简单配置介绍1 1.启动Web项目时,容器回去读web.xml配置文件里的两个节点<context-param>和<listener> 2.接着容器会创建一 ...

  9. H5学习_番外篇_PHP数据库操作

    1. 文件操作 1.1 打开关闭文件 fopen() resource fopen ( string filename, string mode [, bool use_include_path [, ...

  10. 2015-8-29阿里校园招聘研发project师笔试题

    前言:原题来自于网络:http://www.cnblogs.com/nausicaa/p/3946694.html.本人依据自己理解对题目进行解答.因为水平有限.题目有不会做.做错的地方.欢迎大家留言 ...