hdu2732 (Leapin' Lizards)
题目链接:传送门
题目大意:给你 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)的更多相关文章
- HDU2732:Leapin' Lizards(最大流)
Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- HDU 2732:Leapin' Lizards(最大流)
http://acm.hdu.edu.cn/showproblem.php?pid=2732 题意:给出两个地图,蜥蜴从一个柱子跳跃到另外一个地方,那么这个柱子就可能会坍塌,第一个地图是柱子可以容忍跳 ...
- Leapin' Lizards(经典建图,最大流)
Leapin' Lizards http://acm.hdu.edu.cn/showproblem.php?pid=2732 Time Limit: 2000/1000 MS (Java/Others ...
- HDU2732 Leapin' Lizards —— 最大流、拆点
题目链接:https://vjudge.net/problem/HDU-2732 Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others) M ...
- hdu2732 Leapin' Lizards (网络流dinic)
D - Leapin' Lizards Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- HDU2732 Leapin' Lizards
Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- Leapin' Lizards
Leapin' Lizards 题目大意: 在一个网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴 ...
- 【解题报告】 Leapin' Lizards HDU 2732 网络流
[解题报告] Leapin' Lizards HDU 2732 网络流 题外话 在正式讲这个题目之前我想先说几件事 1. 如果大家要做网络流的题目,我在网上看到一个家伙,他那里列出了一堆网络流的题目, ...
随机推荐
- 检查linux网络的状况
http://hi.baidu.com/dr_wang/blog/item/2952f7458659c306cefca3cc.html
- easy ui datagrid 数据分页
参照easyui官方网站提供的demo写了个datagrid数据分页的demo, 具体参数我就不一一罗列了,详细见官方网站, 这里只介绍一下具体的注意事项和常乃用到的几项, $('#test').da ...
- 在windows 2012中安装sharepoint 2013时遇到问题的处理办法
众所周知,sharepoint 2013是早于windows 2012的,所以在安装的时候,总会出现各种奇怪的问题,也就是所谓的一个个坑,为了减少大家掉到坑里的次数和排除故障的时间,我在这里记录下我曾 ...
- golang的各种数据格式的互相转换
int to string import ( "strconv" ) int i = 10 str1 := strconv.Itoa(i) struct to json impor ...
- 关于cnblogs的排版
cnblogs默认的样式实在让我无法接受.今天去看了看div+css的基本知识. 决定这周抄一个别人的排版,稍微改改. 不然,就这样式,实在没心情写博客. 写博客,这次准备要大干一场了.
- Varnish 简介
Varnish是高性能开源的反向代理服务器和HTTP缓存服务器 Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存 Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存 ...
- unity, unlit surface shader (texColor only surface shader)
要实现双面透明无光照只有纹理色的surface shader. 错误的写法:(导致带有曝光) Shader "Custom/doubleFaceTranspTexColor" { ...
- 利用putty的pscp命令上传文件
1.有的时候,本地下载源码包的速度快过vps(主要指国内),那么可以用迅雷下载后上传到vps. 2.为了这么点事情,专门安装一个ftp软件,太麻烦,于是想到了putty贴心的pscp小程序. 3.首先 ...
- redis源码学习_整数集合
redis里面的整数集合保存的都是整数,有int_16.int_32和int_64这3种类型,和C++中的set容器差不多. 同时具备如下特点: 1.set里面的数不重复,均为唯一. 2.set里面的 ...
- SQL Server DTS向导,字段转换出现202和200错误
当使用SQL Server 2012的DTS向导(Import and Export Data/导入导出数据)时,会出现如下问题: 当来源数据直接使用表的时候,没有任何问题 但如果来源数据是查询时,就 ...