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. 如果大家要做网络流的题目,我在网上看到一个家伙,他那里列出了一堆网络流的题目, ...
随机推荐
- 在同一台服务器上启动多个 FreeSWITCH 实例
有时候,需要用到多个FreeSWITCH进行测试,或者需要在一台服务器上部署多个“不兼容”的系统.我们在这一节探讨一下怎么做. 背景故事 几年前我还在Idapted工作的时候,由于需要连接Skype及 ...
- TypeScript 入门指南
你是否听过 TypeScript? TypeScript 是微软开发的 JavaScript 的超集,TypeScript兼容JavaScript,可以载入JavaScript代码然后运行.TypeS ...
- Atitit.sql where条件表达式的原理 attilax概括
Atitit.sql where条件表达式的原理 attilax概括 1. 数据查询接口sql api标准化1 2. Sql接口的问题2 2.1. 虽然sql是结构化的dsl,但是任然是编程语言类型 ...
- [elk]es增删改查最佳实战
PUT app01 GET app01/_settings GET _all/_settings PUT app01/_settings { "number_of_replicas" ...
- Oracle VM VirtualBox虚拟机导出教程
Oracle VM VirtualBox虚拟机导出教程 | 浏览:583 | 更新:2015-01-31 11:21 1 2 3 4 5 6 7 分步阅读 有时我们需要把Oracle VM Virtu ...
- docker jupyter
151 curl -sSL https://get.docker.com/|sh 152 sudo usermode -aG docker ubuntu 153 sudo usermod -aG ...
- win7系统如何配置JAVA环境变量
1.在“计算机”右击选择“属性” 2.点击“高级系统设置” 3.点击“环境变量” 4.点击系统变量下面的“新建” (1)新建->变量名:JAVA_HOME变量值 C:\Program Files ...
- Windows管理多个java版本--解决'has value '1.8',but'1.7' is required'的方法
公司考虑到代码的可持续维护性,要求全部使用java7,自己又想在空闲时间学一些java8的新特性,故在安装完1.7之后又安装了1.8,导致eclisp在启动时报’has value ‘1.8’,but ...
- Oracle与Mysql插入多行数据
Oracle 一. insert allinto students values ('b10050501','zl')into students values ('b10050502','zjw')s ...
- 碉堡完整的高性能PHP应用服务器appserver
完全企业级的开发模式,是一个多线程的 PHP 应用服务器,实现真正多线程的 PHP 编程,高效安全而且快速,以Magento 为例比基于 Nginx的标准安装要快 50%.概念上非常像 Java 的 ...