【题解】Luogu P2472 [SCOI2007]蜥蜴
原题传送门
题目要求无法逃离的最少有多少
直接做肯定不好做,我们帮题目变一个说法:最多能逃离多少
这个询问一看就是最大流
考虑如何建图:
1.将S和每一个有蜥蜴的点连一条流量为1的边(每个蜥蜴只能用1次)
2.每个点拆成两个点(一个点用来连接从其他点连来的边,另一个点用来向其他的点连边,下同),从前一个点向后一个点连一条流量为石柱高度的边(每个石柱只能踩它的高度次)
3.能互相到达的石柱之间连一条流量为inf的边
4.将每一个能跳出地图的点向T连一条流量为inf边
建图后跑一下最大流即可求出答案
#include <bits/stdc++.h>
#define N 1005
#define M 80005
#define inf (1<<30)
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
inline int Min(register int a,register int b)
{
return a<b?a:b;
}
inline int Max(register int a,register int b)
{
return a>b?a:b;
}
struct node{
int to,next,v;
}e[M];
int head[N],cnt=1;
inline void add(register int u,register int v,register int val)
{
e[++cnt]=(node){v,head[u],val};
head[u]=cnt;
}
int n,s,t,maxflow=0,sum=0;
int px[N],py[N],tot=0;
int dep[N],gap[N],cur[N];
inline void bfs()
{
memset(dep,-1,sizeof(dep));
memset(gap,0,sizeof(gap));
dep[t]=0;
++gap[dep[t]];
queue<int> q;
q.push(t);
while(!q.empty())
{
int u=q.front();
q.pop();
for(register int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(dep[v]!=-1)
continue;
q.push(v);
dep[v]=dep[u]+1;
++gap[dep[v]];
}
}
}
inline int dfs(register int u,register int flow)
{
if(u==t)
{
maxflow+=flow;
return flow;
}
int used=0;
for(register int i=cur[u];i;i=e[i].next)
{
cur[u]=i;
int v=e[i].to;
if(e[i].v&&dep[v]+1==dep[u])
{
int tmp=dfs(v,Min(e[i].v,flow-used));
if(tmp)
{
e[i].v-=tmp;
e[i^1].v+=tmp;
used+=tmp;
}
if(used==flow)
return used;
}
}
--gap[dep[u]++]==0?dep[s]=n+1:++gap[dep[u]];
return used;
}
inline void ISAP()
{
maxflow=0;
bfs();
while(dep[s]<n)
{
memcpy(cur,head,sizeof(head));
dfs(s,inf);
}
}
int main()
{
int r=read(),c=read(),d=read();
n=r*c,s=0,t=(n<<1)+1;
for(register int i=1;i<=r;++i)
for(register int j=1;j<=c;++j)
{
char ch=getchar();
while(ch!='0'&&ch!='1'&&ch!='2'&&ch!='3')
ch=getchar();
ch-=48;
if(ch)
{
add(c*(i-1)+j,c*(i-1)+j+n,ch),add(c*(i-1)+j+n,c*(i-1)+j,0);
if(i<=d||i+d>r||j<=d||j+d>c)
add(c*(i-1)+j+n,t,inf),add(t,c*(i-1)+j+n,0);
px[++tot]=i,py[tot]=j;
}
}
for(register int i=1;i<=tot;++i)
for(register int j=i+1;j<=tot;++j)
if(d*d>=(px[i]-px[j])*(px[i]-px[j])+(py[i]-py[j])*(py[i]-py[j]))
{
add(c*(px[i]-1)+py[i]+n,c*(px[j]-1)+py[j],inf),add(c*(px[j]-1)+py[j],c*(px[i]-1)+py[i]+n,0);
add(c*(px[j]-1)+py[j]+n,c*(px[i]-1)+py[i],inf),add(c*(px[i]-1)+py[i],c*(px[j]-1)+py[j]+n,0);
}
for(register int i=1;i<=r;++i)
for(register int j=1;j<=c;++j)
{
char ch=getchar();
while(ch!='.'&&ch!='L')
ch=getchar();
if(ch=='L')
add(s,c*(i-1)+j,1),add(c*(i-1)+j,s,0),++sum;
}
ISAP();
write(sum-maxflow);
return 0;
}
【题解】Luogu 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 分析: 这道题用最大流解决. 首先构建模型. 一根柱子可以跳入和跳出,于是拆成两个点:入点和出点. ...
- P2472 [SCOI2007]蜥蜴
传送门 求无法逃离的蜥蜴总数的最小值就是求最多逃离的蜥蜴总数 所以显然考虑最大流,一个流量的路径就相当于一只蜥蜴逃离的路径 发现每个位置有一个最大经过次数,所以把每个位置拆成两个点$x,y$,$x$ ...
- [洛谷P2472] [SCOI2007]蜥蜴
题目链接: 蜥蜴 题目分析: 一道网络流,先来分析一下问题: 在一个\(r*c\)的图中分布了一些数,其他地方都用\(0\)填充,我们分别从指定的一些数出发,每次可以移动到周围距离为\(d\)以内的数 ...
- 题解 P2472 【[SCOI2007]蜥蜴】
P2472 [SCOI2007]蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱 ...
- [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴
[BZOJ1066][luogu_P2472][SCOI2007]蜥蜴 试题描述 在一个 \(r\) 行 \(c\) 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥 ...
随机推荐
- PCB画板总结
最近几天完成了第一个PCB电路板.虽然器件不是很多,手动布线了4次才达到自己理想的效果. 但是还是有很多细节只有亲自拿到了自己做的板子,亲自焊接之后,才知道自己哪里不合适. 这是修改了4次之后的最终的 ...
- flask将日志写入日志文件
import logging logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别 filename='log_new.log', # 将日志写入lo ...
- phpcms栏目标签调用
$CATEGORY[$catid][catid] 栏目id $CATEGORY[$catid][module] 栏目所在的模块 $C ...
- yarn-RM-check-by-curl
#!bin/bash SELF_DIR="$( cd "$( dirname "$0" )" && pwd )" #grep ...
- MySQL数据查询
数据查询语言DQL select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [ ...
- python学习之旅(十五)
Python基础知识(14):函数(Ⅴ) 一.装饰器 decorator:本质上就是函数,可以增强函数的功能. 定义起来虽然有点复杂,但使用起来非常灵活和方便 1.不修改被装饰函数的源代码 2.不修改 ...
- 下载频道--IT资源关东煮第二期[申明:来源于网络]
下载频道–IT资源关东煮第二期[申明:来源于网络] 地址:http://geek.csdn.net/news/detail/129509?ref=myread
- 使用 EF Core 的 EnableRetryOnFailure 解决短暂的数据库连接失败问题
阿里云服务器有时会出现短暂的连接不上数据库服务器(RDS)的问题,之前由于没有启用 Entity Framework Core 的失败重试功能(默认是禁用的),短暂的连接失败立马会引发下面的异常从而出 ...
- English Time And Date
What's the Time in English? Explanation There are two common ways of telling the time. Formal but ea ...
- dokuwiki 安装配置
dokuwiki如果在用户注册的时候,发生"发送密码邮件时产生错误.请联系管理员!",那么需要配置sendmail. 在linux平台下,参考这个帖子https://www.dok ...