描述

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

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

输入

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

输出

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

 

提示

  【限制】 100%的数据满足:1<=r, c<=20, 1<=d<=3

题解

  这是一道网络流。

  先考虑如何建图:对于每根石柱,我们可以把它拆成两个点,中间连一条容量为其高度的边。对于每根石柱,我们再将它和与它距离不超过d的所有石柱连边,容量无限。对于每根能够跳出去的石柱,我们将它与汇点t相连。对于每根有蜥蜴的石柱,我们将源点s与它相连。这样我们就可以跑最大流了。放上代码:

#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define INF 0x3f3f3f3f
int r,c,d;
int num=,f[N];
struct node{
int u,v,w,nxt;
}e[N<<];
void add(int u,int v,int w){
e[++num]=(node){u,v,w,f[u]};f[u]=num;
e[++num]=(node){v,u,,f[v]};f[v]=num;
}
//build graph
int s,t,dis[N];
int bfs(){
queue<int>q;
memset(dis,-,sizeof(dis));
q.push(s);dis[s]=;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=f[u];i;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(w&&dis[v]==-){
dis[v]=dis[u]+;q.push(v);
if(v==t) return ;
}
}
}
return ;
}
int dfs(int u,int flow){
if(u==t||!flow) return flow;
int ret=;
for(int i=f[u];i;i=e[i].nxt){
int v=e[i].v;
if(e[i].w&&dis[v]==dis[u]+){
int w=dfs(v,min(e[i].w,flow));
if(!w) continue;
ret+=w;flow-=w;e[i].w-=w;e[i^].w+=w;
if(!flow) break;
}
}
if(!ret) dis[u]=-;
return ret;
}
int dinic(){
int mf=;
while(bfs()){mf+=dfs(s,INF);}
return mf;
}
//flow
int cnt,id[][][],mp[][];
char ch[];
int dist(int xx,int yy){return xx*xx+yy*yy;}
int ID(int i,int j){return (i-)*c+j;}
int main(){
scanf("%d%d%d",&r,&c,&d);s=;t=(r*c)<<|;
for(int i=;i<=r;i++){
scanf("%s",ch+);
for(int j=;j<=c;j++){
mp[i][j]=ch[j]-'';
id[i][j][]=ID(i,j);id[i][j][]=id[i][j][]+r*c;
if(mp[i][j]) add(id[i][j][],id[i][j][],mp[i][j]);
}
}
for(int i=;i<=r;i++){
scanf("%s",ch+);
for(int j=;j<=c;j++){if(ch[j]=='L') cnt++,add(s,id[i][j][],);}
}
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
if(!mp[i][j]) continue;
if(i<=d||j<=d||r-i+<=d||c-j+<=d) add(id[i][j][],t,INF);
for(int dx=-d;dx<=d;dx++){
int xx=i+dx;
if(xx<||xx>r) continue;
for(int dy=-d;dy<=d;dy++){
int yy=j+dy;
if(yy<||yy>c||!mp[xx][yy]||dist(xx-i,yy-j)>d*d) continue;
if(xx==i&&yy==j) continue;
add(id[i][j][],id[xx][yy][],INF);
}
}
}
}
printf("%d",cnt-dinic());
return ;
}

WOJ#1243 蜥蜴 lizard的更多相关文章

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

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

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

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

  3. [洛谷P2472] [SCOI2007]蜥蜴

    题目链接: 蜥蜴 题目分析: 一道网络流,先来分析一下问题: 在一个\(r*c\)的图中分布了一些数,其他地方都用\(0\)填充,我们分别从指定的一些数出发,每次可以移动到周围距离为\(d\)以内的数 ...

  4. 1066: [SCOI2007]蜥蜴

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

  5. bzoj 1066 蜥蜴

    最大流. 建图:首先将每根柱子拆成两个点. 每根柱子的入点向出点连一条容量为柱子高度的边. 每根柱子的出点向可以到达的柱子的入点连一条容量为正无穷的边. 源点向每根初始有蜥蜴的柱子的入点连一条容量为一 ...

  6. BZOJ 1066 【SCOI2007】 蜥蜴

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

  7. 蜥蜴(bzoj 1066)

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

  8. WOJ -1204

    WOJ -1204 1 出现次数大于一半 那么就利用普通的堆栈的思想,如果删除两个不同的元素,原来的多数元素还是多数元素,所以采取按条件入栈的方法,如果和top元素相同则入栈,否则top--,此元素也 ...

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

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

随机推荐

  1. eclipse安装心得和环境变量配置的体会

    从昨天开始就开始安装eclipse,一开始觉得安装eclipse很简单,肯定就跟下个游戏差不多,但是打开官网之后发现下载的安装包不能用,经过搜索之后发现是因为下载源不对.改过下载源之后下载的安装包竟然 ...

  2. Python----公开课

    # 构造函数- 类在实例化的时候,执行一些基础性的初始化的工作- 使用特殊的名称和写法- 在实例化的时候自动执行- 是在实例化的时候第一个被执行的函数- ----------------------- ...

  3. HBase设计规范(转载)

    在这里讲什么设计规范实在是有些不知天高地厚,毕竟笔者本人也只是一个大数据技术的初学者,断然不敢制订什么设计规范的,所以请原谅我的狂妄,这个设计规范,只是本人对自己制订的,与别人无关. 之前,HBase ...

  4. 【leetcode】All Paths From Source to Target

    题目如下: Given a directed, acyclic graph of N nodes. Find all possible paths from node 0 to node N-1, a ...

  5. vueroute的router.addRoutes

    router.addRoutes(routes: Array<RouteConfig>)动态添加更多路由到路由器.参数必须是使用与routes构造函数选项相同的路径配置格式的Array .

  6. react native之使用AsyncStorage 进行数据持久化存储

    新建AsncStorageDemoPage.js import React, {Component} from 'react'; import { StyleSheet, View, Text, Bu ...

  7. C中的system函数

    windows操作系统下system () 函数详解(主要是在C语言中的应用) 函数名: system 功 能: 发出一个DOS命令 用 法: int system(char *command); s ...

  8. Codeforces Gym 100269 Dwarf Tower (最短路)

    题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game na ...

  9. 北风设计模式课程---接口分离原则(Interface Segregation Principle)

    北风设计模式课程---接口分离原则(Interface Segregation Principle) 一.总结 一句话总结: 接口分离原则描述为 "客户类不应被强迫依赖那些它们不需要的接口& ...

  10. TreeSet 源码分析

    TreeSet 1)底层由 TreeMap 支持的 Set 接口实现,Set 中的元素按照自然顺序或指定的比较器排序. 创建实例 /** * 支持此 Set 的底层的 TreeMap 对象 */ pr ...