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] ...
随机推荐
- Windows 毫秒计时
#include <windows.h> #include <iostream> using namespace std; LARGE_INTEGER MilliSecondT ...
- laravel @if
- [Training Video - 4] [Groovy] Function in detail
Employee.log=log Employee e1 = new Employee() Employee e2 = new Employee() e1.name = "A" e ...
- Mcrosoft中间语言的主要特征
Mcrosoft中间语言显然在.NET FrameWork中起着非常重要的作用.现在讨论一下IL(Intermideate Language)的主要特征.因为面向.NET的所有语言在逻辑上都需要支持I ...
- Java Persistence with MyBatis 3(中文版)
译者的话 前段时间由于工作和学习的需要,我打算深入研究MyBatis框架.于是在网上查找关于MyBatis的教程,发现国内网上关于MyBatis的教程资料少得可怜:除了MyBatis官网上的用户使用手 ...
- xStream完美转换XML、JSON(转)
xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换: 前面有介绍过json-lib这个框架,在线博文:htt ...
- 使用UrlRewriteFilter对url进行更替
一般来说,使用struts之后url的访问实际上访问的是action的地址,为了不让该地址暴露给别人,可以采用UrlRewriteFilter来对url进行重写. 首先,在web.xml里面配置: & ...
- Demo—cookie电商购物车
说明:cookie的操作须有域名,简单点说就是需要用发布的方式去访问,查看cookie信息请用开发者模式进入application栏 1.页面布局(结构)(根目录) 商品列表 <!doctype ...
- Unity NetWork
using UnityEngine; using System.Collections; public class NetworkTest : MonoBehaviour { ;//端口号 strin ...
- 怎么用谷歌浏览器查看请求或响应HTTP头?
要使用谷歌浏览器查看请求或响应HTTP标头,可以采取以下步骤: 在Chrome浏览器,访问一个网址,点击右键,选择检查,打开开发人员工具(或直接按F12). 选择 Network 选项卡. 重新加载页 ...