题目链接:传送门

题目大意:给你 n,m  n:有几行图,m是一个人最多跳m个曼哈顿距离。

     给你两张图,第一张图数字为0表示没有柱子,否则有柱子且只能跳出去 x 次(x为当前字符代表的数字)

     第二张图 '.'表示没人,'L'表示当前位置有一个人,问通过柱子之间跳跃最后最少有多少人不能逃出去。

     逃出去只能是柱子与边界的最小曼哈顿距离小于等于 m。

题目思路:拆点网络流

     首先虚拟源汇点 S,T

     其实这道题构图建模不难想,既然某个柱子只能跳 x 次,那就把它拆为两点,连边容量为 x,这样保证合法性。

     相互之间可达的柱子连边容量 inf,因为柱子已经拆点来保证合法,所以柱子间初始化不用受限制。

     可与外界相通的柱子与 T 连边容量 inf,刚开始有人的柱子与 S 连边容量为 1。

     然后ISAP跑网络流即可。

     此题坑点:输出时注意单复数输出的不同

    久违的1A

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 2000000
#define maxn 500005
typedef pair<int,int> PII;
typedef long long LL; map<PII,int>M; ///map来记录点
int n,m,ccnt,S,T,len,peo,ans;
int head[],hcnt,d[],pre[],gap[],cur[];
char pic[][];
struct Crd{int x,y,v;}co[];
struct Node{int to,nxt,f;Node(){}Node(int a,int b,int c):to(a),nxt(b),f(c){}}node[N];
bool judge(int x,int y){ ///曼哈顿距离判断
int temp=abs(co[x].x-co[y].x);
temp+=abs(co[x].y-co[y].y);
return temp<=m;
}
inline void add(int x,int y,int f){
node[hcnt]=Node(y,head[x],f);head[x]=hcnt++;
node[hcnt]=Node(x,head[y],);head[y]=hcnt++;
}
void ISAP(int S,int T,int n){
ans=;
int aug=inf,i,flag;
int u,e,dis;
mst(gap,);mst(d,);
for(i=;i<=n;++i)cur[i]=head[i];
u=pre[S]=S;
while(d[S]<n){
flag=;
for(i=cur[u];~i;i=node[i].nxt){
e=node[i].to;
if(node[i].f>&&d[u]==d[e]+){
flag=;
break;
}
}
if(flag){
pre[e]=u;
cur[u]=i;
aug=min(aug,node[i].f);
u=e;
if(u==T){
while(u!=S){
u=pre[u];
node[cur[u]].f-=aug;
node[cur[u]^].f+=aug;
}
u=S;
ans+=aug;
aug=inf;
}
}
else{
if(--gap[d[u]]==)break;
dis=n;
cur[u]=head[u];
for(int i=head[u];~i;i=node[i].nxt){
e=node[i].to;
if(node[i].f>&&d[e]+<dis){
dis=d[e]+;
cur[u]=i;
}
}
d[u]=dis;
++gap[dis];
if(u!=S)u=pre[u];
}
}
}
int main(){
int i,j,group,Case=;
scanf("%d",&group);
while(group--){
M.clear();
len=hcnt=;ccnt=;
mst(head,-);
scanf("%d%d",&n,&m);
gets(pic[]);
for(i=;i<=n;++i){
gets(pic[i]+);
if(!len)len=strlen(pic[i]+);
for(j=;j<=len;++j){
if(pic[i][j]>''){
co[++ccnt].x=i; ///ccnt是点的个数
co[ccnt].y=j;
co[ccnt].v=pic[i][j]-'';
M[make_pair(i,j)]=ccnt;
}
}
}
S=;T=ccnt*+;
for(i=;i<=ccnt;++i){
add(i,i+ccnt,co[i].v); ///柱子拆点连边
if(co[i].x<=m||(n-co[i].x+)<=m||co[i].y<=m||(len-co[i].y+)<=m)
add(i+ccnt,T,inf); ///与外界相通的柱子
for(j=;j<i;++j){
if(judge(i,j)){
add(i+ccnt,j,inf); ///相互可达的柱子
add(j+ccnt,i,inf);
}
}
}
peo=; ///一共多少人
for(i=;i<=n;++i){
gets(pic[i]+);
for(j=;j<=len;++j){
if(pic[i][j]=='L'){
++peo;
int tt=M[make_pair(i,j)];
add(S,tt,);
}
}
}
ISAP(S,T,T+);
ans=peo-ans;
printf("Case #%d: ",++Case);
if(!ans)printf("no lizard was left behind.\n");
else if(ans==)printf("1 lizard was left behind.\n");
else printf("%d lizards were left behind.\n",ans);
}
return ;
}

hdu2732 (Leapin' Lizards)的更多相关文章

  1. HDU2732:Leapin' Lizards(最大流)

    Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  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. HDU 2732:Leapin' Lizards(最大流)

    http://acm.hdu.edu.cn/showproblem.php?pid=2732 题意:给出两个地图,蜥蜴从一个柱子跳跃到另外一个地方,那么这个柱子就可能会坍塌,第一个地图是柱子可以容忍跳 ...

  4. Leapin' Lizards(经典建图,最大流)

    Leapin' Lizards http://acm.hdu.edu.cn/showproblem.php?pid=2732 Time Limit: 2000/1000 MS (Java/Others ...

  5. HDU2732 Leapin' Lizards —— 最大流、拆点

    题目链接:https://vjudge.net/problem/HDU-2732 Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    M ...

  6. hdu2732 Leapin' Lizards (网络流dinic)

    D - Leapin' Lizards Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  7. HDU2732 Leapin' Lizards

    Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. Leapin' Lizards

    Leapin' Lizards 题目大意: 在一个网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴 ...

  9. 【解题报告】 Leapin' Lizards HDU 2732 网络流

    [解题报告] Leapin' Lizards HDU 2732 网络流 题外话 在正式讲这个题目之前我想先说几件事 1. 如果大家要做网络流的题目,我在网上看到一个家伙,他那里列出了一堆网络流的题目, ...

随机推荐

  1. PHP-PHP程序员的技术成长规划(By黑夜路人)

    按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定 ...

  2. excel合并单元格

    最简单的: =A1&B1&C1 在C14单元格中输入公式:=CONCATENATE(A14,"@",B14,".com"),确认后,即可将A14 ...

  3. IDEA启动服务慢的问题处理

    问题描述: 微服务模式下统一启动服务,很慢如下图: 这种情况是IDEA工作环境有问题. 解决方法: 从SVN或者Git重新检出项目,即可解决.

  4. 使用cros实现跨域请求

    直接上代码 后端 this.Response.Headers.Add("Access-Control-Allow-Origin","*"); 响应流里添加一个h ...

  5. python oop面向对象笔记

    #coding:utf-8 class Person(object): def __init__(self,name,wage): self.name = name self.wage = wage ...

  6. JavaNIO - AbstractInterruptibleChannel

    1. 描述 可异步关闭和中断的Channel. (1)实现InterruptibleChannel接口的Channel支持异步关闭:如果一个线程IO阻塞在一个可中断的channel,另一个线程可以执行 ...

  7. C/C++ 错误笔记-解决swap函数与标准库的std::swap函数冲突的问题

    下午写了一份代码: #include <iostream> using namespace std; // 模板1:交换基本类型的值 template<typename T> ...

  8. Redis-ha(sentinel)搭建

    服务器描述:本次搭建是用来测试,所以是在一台服务器上搭建三个redis服务(一主两从) 服务角色 端口 Redis.conf名称 sentinel配置文件名称 sentinel端口 redis日志路径 ...

  9. linux系统的开机引导、启动流程

    固件(CMOS/BIOS) > POST 加电自检 ↓ 自举程序(GRUB)> 加载内核 ↓ 载入内核 > 驱动硬件 ↓ 启动进程 init ↓ 读取执行配置文件/etc/initt ...

  10. JavaScript学习日志(2)

    javascript数据类型: 字符串string.数字number.未定义Undefined.空Null.布尔Boolean.数组Array.对象Object.javascript对象: 对象由花括 ...