题目链接:传送门

题目大意:给你 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. angular绑定数据 使用循环输出列表数据

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...

  2. ASP.NET 之XML:要插入的节点出自不同的文档上下文

    异常详细信息:   System.ArgumentException:   要插入的节点出自不同的文档上下文. 产生状况:现在有两个xml文件,我想把这两个xml合并,在给xml节点插入一个子节点时出 ...

  3. python selenium--常用函数3

    ActionChains类鼠标操作的常用方法: 引入ActionChains类:from selenium.webdriver.common.action_chains import ActionCh ...

  4. android 中的 Handler 线程间通信

    一. 在MainActivity中为什么只是类似的写一行如下代码就可以使用handler了呢? Handler handler = new Handler() { @Override public v ...

  5. homebrew osx下面最优秀的包管理工具

    官方网站:https://brew.sh/index_zh-cn 安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserconten ...

  6. 多线程-synchronized

    引言 synchronized是Java线程同步中的一个重要的概念,synchronized是独占锁(互斥锁),同时也是可重入锁(可重入锁一定程度上避免了死锁的问题,内部是关联一个计数器,加一次锁计数 ...

  7. Objective-C_Block

    一.Block语法 Block:块语法,本质上是匿名函数(没有名称的函数),Block变量存放函数的实现,通过Block变量能直接调⽤函数.标准C里面没有Block.C语言的后期扩展版本号.加⼊了匿名 ...

  8. vue路由使用

    <body> <div id="itany"> <div> <!--使用router-link组件来定义导航,to属性指定链接url--& ...

  9. 快速解读GC日志

    本文是 Plumbr 发行的 Java垃圾收集指南 的部分内容.文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息.我们通过 -XX:+UseSerialGC 选项,指定JVM ...

  10. maven仓库国内镜像

    <mirror>        <id>alimaven</id>        <name>aliyun maven</name>     ...