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. 如果大家要做网络流的题目,我在网上看到一个家伙,他那里列出了一堆网络流的题目, ...
随机推荐
- Maven的镜像设置
文件位置 国内的阿里云 <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven< ...
- SSI整合 示例
sql语句 create table user_c (id varchar(10) primary key,name varchar(20),age int ,address varchar(30); ...
- 域对象的引用,ActionContext 和ServletActionContext类的使用
ActionContext 获取 域引用的map ServletActionContext获取具体域对象 //域范围 ActionContext ac = ActionContext.getConte ...
- Call to undefined function mysql_connect()
Fatal error: Call to undefined function mysql_connect() in /data/www/qy_b2b/include/db_mysql.class.p ...
- mongod启动时候几个参数说明
1.--storageEngine从3.0开始,新增了一个存储引擎WT.老版本的存储引擎被称作mmapv1 2.--oplogSizeOplog是复制的主要组成部分,位于local数据库中.在初始化复 ...
- 4~20mA模拟输出(电流环)应用笔记(转)
https://zm12.sm-tc.cn/?src=http%3A%2F%2Fwww.aichengxu.com%2Fview%2F5397788&uid=d2f68cd7fd230c162 ...
- Vivado的helloword程序:硬件工程部分
硬件平台:ZedBoard软件平台:vivado2013.3 本示例通过综合.实现,生成比特流,发送到SDK实现.启动vivado并且创建一个项目根据提示操作一步步创建新项目的时候记得选择RTL Pr ...
- zooKeeper_《ZooKeeper官方指南》一致性保障
转 http://ifeve.com/zookeeper-consistency-guarantees/ 本文翻译自<ZooKeeper官方指南>,译者:追云,校对:追云 一致性保障 Zo ...
- python学习之join()
str.join(iterable) 该方法用来分隔字符串的. 例子 >>> b':'.join((b'leo',b'999')) b'leo:999' >>> ' ...
- CSU 1329: 一行盒子
1329: 一行盒子 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 740 Solved: 145[Submit][Status][Web Board ...