HDU2732 Leapin' Lizards 网络流 最大流 SAP
原文链接http://www.cnblogs.com/zhouzhendong/p/8362002.html
题目传送门 - HDU2732
题意概括
给你一个网格,网格上的一些位置上有一只蜥蜴,所有蜥蜴的最大跳跃距离是d,如果一只蜥蜴能跳出网格边缘,那么它就安全了.且每个网格有一个最大跳出次数x,即最多有x只蜥蜴从这个网格跳出,这个网格就再也不能有蜥蜴进来了.问你最少有多少只蜥蜴跳不出网格.
(摘自http://blog.csdn.net/u013480600/article/details/38964749)
题解
我们考虑到每一个点有限制经过次数,自然想到网络流。
对于点限流,我们自然是拆点。(套路)
于是,一个点拆成两个点,连一条边,容量为点的限流。
我们考虑只有原来就有蜥蜴的点才能拥有初始流量,所以对于每一个有蜥蜴的点,从源点连一条容量为1的边。
我们考虑从一个点跳到其他的点:
如果可以直接跳出去,那自然是直接跳出去好,所以从该点向汇点连一条容量为INF的边。
如果不能,那么流连向所有可以到达的点,容量为INF。
这个输出分类很恶心,我因为no的地方加了个s而找错很久。
主要是我一直在信心慢慢的找网络流和构图的错误……我认为我的输出一定不会错的……然后就……
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
const int N=1005,M=N*N*3,INF=1e9;
struct edge{
int x,y,cap,flow,nxt;
};
struct gragh{
int cnt,fst[N],dist[N],n,S,T,num[N],cur[N],p[N];
int q[N],head,tail;
edge e[M];
void set(int _S,int _T,int _n){
S=_S,T=_T,n=_n,cnt=1;
memset(fst,0,sizeof fst);
}
void add(int a,int b,int c){
cnt++;
e[cnt].x=a,e[cnt].y=b,e[cnt].cap=c,e[cnt].flow=0;
e[cnt].nxt=fst[a],fst[a]=cnt;
cnt++;
e[cnt].x=b,e[cnt].y=a,e[cnt].cap=0,e[cnt].flow=0;
e[cnt].nxt=fst[b],fst[b]=cnt;
}
void bfs(){
memset(dist,-1,sizeof dist);
head=tail=dist[T]=0;
q[++tail]=T;
while (head<tail)
for (int x=q[++head],y,i=fst[x];i;i=e[i].nxt)
if ((i&1)&&dist[y=e[i].y]==-1)
dist[q[++tail]=y]=dist[x]+1;
for (int i=1;i<=n;i++)
if (dist[i]==-1)
dist[i]=n;
}
void init(){
bfs();
memset(num,0,sizeof num);
for (int i=1;i<=n;i++)
num[dist[i]]++,cur[i]=fst[i];
}
int Augment(int &x){
int ex_flow=INF;
for (int i=T;i!=S;i=e[p[i]].x)
if (e[p[i]].cap-e[p[i]].flow<=ex_flow)
ex_flow=e[p[i]].cap-e[p[i]].flow,x=e[p[i]].x;
for (int i=T;i!=S;i=e[p[i]].x)
e[p[i]].flow+=ex_flow,e[p[i]^1].flow-=ex_flow;
return ex_flow;
}
int ISAP(){
int x=S,y,MaxFlow=0;
init();
while (dist[S]<n){
if (x==T){
MaxFlow+=Augment(x);
continue;
}
bool found=0;
for (int i=cur[x];i;i=e[i].nxt)
if (dist[y=e[i].y]+1==dist[x]&&e[i].cap>e[i].flow){
cur[x]=p[y]=i,x=y,found=1;
break;
}
if (!found){
int d=n+1;
for (int i=fst[x];i;i=e[i].nxt)
if (e[i].cap>e[i].flow)
d=min(d,dist[e[i].y]+1);
if (!--num[dist[x]])
return MaxFlow;
num[dist[x]=d]++,cur[x]=fst[x],x=x==S?x:e[p[x]].x;
}
}
return MaxFlow;
}
}g;
int T,n,m,d,Case=0;
char r1[25][25],r2[25][25];
bool Out(int x,int y){
return min(min(x,n+1-x),min(y,m+1-y))<=d;
}
int Ha(int x,int y,int in){
return in*n*m+(x-1)*m+y;
}
void solve(){
int S,T;
scanf("%d%d",&n,&d);
for (int i=1;i<=n;i++)
scanf("%s",r2[i]+1);
for (int i=1;i<=n;i++)
scanf("%s",r1[i]+1);
m=strlen(r1[1]+1);
g.set(S=n*m*2+1,T=n*m*2+2,n*m*2+2);
int ans=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++){
if (r1[i][j]=='L')
g.add(S,Ha(i,j,0),1),ans++;
g.add(Ha(i,j,0),Ha(i,j,1),r2[i][j]-'0');
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++){
if (Out(i,j))
g.add(Ha(i,j,1),T,INF);
else
for (int x=1;x<=n;x++)
for (int y=1;y<=m;y++)
if ((x!=i||y!=j)&&sqrt((i-x)*(i-x)+(j-y)*(j-y))<=d)
g.add(Ha(i,j,1),Ha(x,y,0),INF);
}
ans-=g.ISAP();
printf("Case #%d: ",++Case);
if (ans==0)
printf("no lizard was left behind.\n");
if (ans==1)
printf("1 lizard was left behind.\n");
if (ans>1)
printf("%d lizards were left behind.\n",ans);
}
int main(){
scanf("%d",&T);
while (T--)
solve();
return 0;
}
HDU2732 Leapin' Lizards 网络流 最大流 SAP的更多相关文章
- hdu2732 Leapin' Lizards (网络流dinic)
D - Leapin' Lizards Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- HDU2732 Leapin' Lizards —— 最大流、拆点
题目链接:https://vjudge.net/problem/HDU-2732 Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU2732:Leapin' Lizards(最大流)
Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU2732 Leapin' Lizards
Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu2732 Leapin' Lizards 最大流+拆点
Your platoon of wandering lizards has entered a strange room in the labyrinth you are exploring. As ...
- HDU2732 Leapin' Lizards 最大流
题目 题意: t组输入,然后地图有n行m列,且n,m<=20.有一个最大跳跃距离d.后面输入一个n行的地图,每一个位置有一个值,代表这个位置的柱子可以经过多少个猴子.之后再输入一个地图'L'代表 ...
- POJ1273 USACO 4.2.1 Drainage Ditches CodeVS1993草地排水 网络流 最大流 SAP
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - POJ 传送门 - CodeVS 题意概括 给出一个图,告诉你边和容量,起点是1,汇点是n,让你求最大流. 题解 ...
- HDU 2732:Leapin' Lizards(最大流)
http://acm.hdu.edu.cn/showproblem.php?pid=2732 题意:给出两个地图,蜥蜴从一个柱子跳跃到另外一个地方,那么这个柱子就可能会坍塌,第一个地图是柱子可以容忍跳 ...
- hdu 2732 Leapin' Lizards(最大流)Mid-Central USA 2005
废话: 这道题不难,稍微构造一下图就可以套最大流的模板了.但是我还是花了好久才解决.一方面是最近确实非常没状态(托词,其实就是最近特别颓废,整天玩游戏看小说,没法静下心来学习),另一方面是不够细心,输 ...
随机推荐
- /var/run/yum.pid 已被锁定,PID 为 2925 的另一个程序正在运行
解决办法:直接在终端运行 rm -f /var/run/yum.pid 将该文件删除,然后再次运行yum.
- Go append 省略号
1 前言 Golang append加...用法缘由 2 代码 type Product struct { ID int64 `json:"id"` Name string `js ...
- NPOI打印设置
打印设置主要包括方向设置.缩放.纸张设置.页边距等.NPOI 1.2支持大部分打印属性,能够让你轻松满足客户的打印需要. 方向设置首先是方向设置,Excel支持两种页面方向,即纵向和横向. 在NPOI ...
- Idea-Java接入银联支付的Demo
注:本文来源于:< Idea-Java接入银联支付的Demo > 接入银联支付的Demo,希望能给大家节约一点时间 https://github.com/wangfei0904306/un ...
- Confluence 6 配置避免管理员联系表单垃圾
你可以配置 Confluence 使用验证码(Captcha)来避免垃圾内容发送给 Confluence 管理员.有关管理员联系表单验证码的内容在全站验证码设置中进行配置,相关的文档请参考 Confi ...
- Scala-IDE构建Maven项目
本教程演示如何使用Scala-IDE构建一个Scala Maven项目. 1. 下载Scala IDE 通过以下链接下载Scala IDE: http://scala-ide.org/download ...
- django 之知识点总结以及Form组件
一.model常用操作 1.13个API查询:all,filter,get ,values,values_list,distinct,order_by ,reverse , exclude(排除),c ...
- 补充的flask实例化参数以及信号
一.实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.from_pyfile('settin ...
- 【python】控制台输出颜色
来源:http://www.cnblogs.com/yinjia/p/5559702.html 在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端 ...
- 渗透测试(theharvester >>steghide)
1.不喜欢自己搭建平台来做测试,所以啦..... 网络信息安全漏洞的威胁总结起来就是人的漏洞,拿DNS服务器来说,一般不出现问题就不会管他,所以很多会被黑客利用,DNS服务器保存了企业内部的IP地址列 ...