P2472 [SCOI2007]蜥蜴
求无法逃离的蜥蜴总数的最小值就是求最多逃离的蜥蜴总数
所以显然考虑最大流,一个流量的路径就相当于一只蜥蜴逃离的路径
发现每个位置有一个最大经过次数,所以把每个位置拆成两个点$x,y$,$x$ 到 $y$ 连流量为最大经过次数的边
从源点向每个蜥蜴的初始位置的 $x$ 连一条流量为 $1$ 的边,表示初始时这些位置有蜥蜴
然后对于每一个位置 $u$, $dfs$ 找出所有走 $d$ 步以内能到的位置 $v$,然后从 $u$ 的 $y$ 点向 $v$ 的 $x$ 点连一条流量 $INF$ 的边,表示蜥蜴从 $u$ 跳到 $v$
注意 $dfs$ 判断一下到达边界的情况,有的话就往汇点连流量 $INF$ 的边
然后 总蜥蜴数 - 最大流 就是答案了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+,INF=1e9+,xx[]={,,,-},yy[]={,,-,};
int fir[N],from[N<<],to[N<<],val[N<<],cntt=;
inline void add(int a,int b,int c)
{
from[++cntt]=fir[a]; fir[a]=cntt;
to[cntt]=b; val[cntt]=c;
from[++cntt]=fir[b]; fir[b]=cntt;
to[cntt]=a; val[cntt]=;
}
int dep[N],Fir[N],S,T;
queue <int> Q;
bool BFS()
{
for(int i=S;i<=T;i++) Fir[i]=fir[i],dep[i]=;
dep[S]=; Q.push(S); int x;
while(!Q.empty())
{
x=Q.front(); Q.pop();
for(int i=fir[x];i;i=from[i])
{
int &v=to[i]; if(dep[v]||!val[i]) continue;
dep[v]=dep[x]+; Q.push(v);
}
}
return dep[T]>;
}
int DFS(int x,int mxfl)
{
if(x==T||!mxfl) return mxfl;
int fl=,res;
for(int &i=Fir[x];i;i=from[i])
{
int &v=to[i]; if(dep[v]!=dep[x]+||!val[i]) continue;
if( res=DFS(v,min(mxfl,val[i])) )
{
mxfl-=res; fl+=res;
val[i]-=res; val[i^]+=res;
if(!mxfl) break;
}
}
return fl;
}
inline int Dinic() { int res=; while(BFS()) res+=DFS(S,INF); return res; }
//以上网络流模板 int n,m,D,nm,id[][],ans;//id存每个位置的x, y=x+n*m
bool vis[][];//dfs时防止重复走
int mp[][];//mp存每个位置的限制
inline void dfs(int s,int x,int y,int stp)//起点,坐标x,y,走了stp步
{
if(stp==D) return;
vis[x][y]=;
for(int k=;k<;k++)
{
int tx=x+xx[k],ty=y+yy[k];
if(vis[tx][ty]) continue;
if(tx<||tx>n||ty<||ty>m) { add(nm+s,T,INF); continue; }//特判出界
if(mp[tx][ty]) add(nm+s,id[tx][ty],INF);
dfs(s,tx,ty,stp+);
}
vis[x][y]=;
}
int main()
{
int a; char c[];
n=read(),m=read(),D=read();
S=,T=(n*m<<)+; nm=n*m;
for(int i=;i<=n;i++)
{
scanf("%s",c+);
for(int j=;j<=m;j++)
{
id[i][j]=(i-)*m+j; mp[i][j]=a=c[j]-'';
if(a) add(id[i][j],nm+id[i][j],a);//每个位置的x向y连边
}
}
for(int i=;i<=n;i++)
{
scanf("%s",c+);
for(int j=;j<=m;j++)
{
if(mp[i][j]) dfs(id[i][j],i,j,);
if(c[j]=='L') add(S,id[i][j],),ans++;//初始蜥蜴
}
}
printf("%d\n",ans-Dinic());
return ;
}
P2472 [SCOI2007]蜥蜴的更多相关文章
- P2472 [SCOI2007]蜥蜴(网络流)
P2472 [SCOI2007]蜥蜴 把每个点拆成2个点,两点之间连边的边权为石柱高度 新建虚拟源点$S$和汇点$T$ $S$向所有有蜥蜴的点连边,边权1 其他边都连$inf$ 剩下就是裸的$dini ...
- P2472 [SCOI2007]蜥蜴(网络最大流)
P2472 [SCOI2007]蜥蜴 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距 ...
- P2472 [SCOI2007]蜥蜴 (最大流)
题目 P2472 [SCOI2007]蜥蜴 解析 这个题思路比较清晰,本(qi)来(shi)以(jiu)为(shi)无脑建图跑最大流,结果挂了,整了一个小时后重新建图才过的. 建立一个超级源点和一个超 ...
- P2472 [SCOI2007]蜥蜴(最大流)
P2472 [SCOI2007]蜥蜴 自己第一道独立做题且一遍AC的网络流题纪念... 看到这道题我就想到网络流建图的方式了... 首先根据每个高度,我们将每个点拆成两个点限流.之后根据跳的最大距离, ...
- 洛谷P2472 [SCOI2007]蜥蜴 题解
题目链接: https://www.luogu.org/problemnew/show/P2472 分析: 这道题用最大流解决. 首先构建模型. 一根柱子可以跳入和跳出,于是拆成两个点:入点和出点. ...
- 【题解】Luogu P2472 [SCOI2007]蜥蜴
原题传送门 题目要求无法逃离的最少有多少 直接做肯定不好做,我们帮题目变一个说法:最多能逃离多少 这个询问一看就是最大流 考虑如何建图: 1.将S和每一个有蜥蜴的点连一条流量为1的边(每个蜥蜴只能用1 ...
- [洛谷P2472] [SCOI2007]蜥蜴
题目链接: 蜥蜴 题目分析: 一道网络流,先来分析一下问题: 在一个\(r*c\)的图中分布了一些数,其他地方都用\(0\)填充,我们分别从指定的一些数出发,每次可以移动到周围距离为\(d\)以内的数 ...
- 题解 P2472 【[SCOI2007]蜥蜴】
P2472 [SCOI2007]蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱 ...
- 1066: [SCOI2007]蜥蜴
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3545 Solved: 1771[Submit][Status] ...
随机推荐
- 十万个为什么:现在还没发现“虚函数virtual”和多态性的优点,估计是因为我还没有编程序吧。
十万个为什么:现在还没发现“虚函数virtual”和多态性的优点,估计是因为我还没有编程序吧.
- [Excel]鼠标右键菜单没有新建Word、Excel、PPT怎么办?
很多朋友在安装好Office(2010或2013等)之后,发现右键新建中没有Word.Excel.PowerPoint等项,但是自己的Office却明明安装好了.这个时候该怎么办呢?这里,本文为大家提 ...
- Flask框架 之 第三方组件
浏览目录 flask-session flask-sqlalchemy flask-script flask-migrate flask-session 安装 pip3 install flask-s ...
- ant+proguard签名打包 .jar
ant+proguard签名打包 .jar 摘自: https://blog.csdn.net/a_ycmbc/article/details/53432812 2016年12月02日 14:52:3 ...
- Oracle 递归
当对象存在父节点.子节点时,通过特定的方式获取父节点.子节点数据构建树状结构或其它形式结构时,通常都会使用递归,如:一个公司有多个部门.每个部门下可能有多个小部门,小部门下面又有组-.为了数据容易 ...
- TF Boys (TensorFlow Boys ) 养成记(五): CIFAR10 Model 和 TensorFlow 的四种交叉熵介绍
有了数据,有了网络结构,下面我们就来写 cifar10 的代码. 首先处理输入,在 /home/your_name/TensorFlow/cifar10/ 下建立 cifar10_input.py,输 ...
- Mac/win下的docker容器和LAMP环境的安装(亲测)
docker直接在官网下载就行了无需赘述 接下来就是在终端中运行docker docker ps 显示当前运行的容器 docker images 显示以及装在的镜像 接下来我们安装centos镜像 d ...
- spring-boot-maven-plugin插件作用
转自:http://blog.csdn.net/hotdust/article/details/51404828 OM 文件中添加了“org.springframework.boot:spring-b ...
- ThinkJS 中的Logic层
第一个为什么需要Logic层: 当在 Action 里处理用户的请求时,经常要先获取用户提交过来的数据,然后对其校验,如果校验没问题后才能进行后续的操作:当参数校验完成后,有时候还要进行权限判断等,这 ...
- Android-自定义IntentSession来传递数据
在上一篇博客中介绍到,Android-Intent意图传递数据,能够传递基本数据类型系列,能够传递对象(需要序列化),等操作: 但是如果要传递 List<T>,这种类型的数据,就不能通过I ...