发现实际上就是在求有多少只蜥蜴能逃出来。

发现可以将柱子拆成入点和出点两部分,自己的出点向别人的入点连边,自己的入点向自己的出点连边。最后再加一个超级源点 \(S\),连接所有有蜥蜴的柱子入点;再加一个超级汇点 \(T\),连接所有能够跳出地图的柱子。

我们猛然发现:这个问题不就是求最大流吗?

考虑每种边的容量:

  1. \(S\) 到入点。由于每个柱子至多有一只蜥蜴,所以容量为 \(1\)。

  2. 入点到出点。每个柱子只能向外跳 \(h_{i,j}\) 次,所以容量为 \(h_{i,j}\)。

  3. 出点到入点/ \(T\):这个没有限制,随便跳多少个都行,所以容量无限。

时间复杂度看似是 \(O(n^8)\),但果真如此吗?

考虑 \(d\) 最大为 \(4\),距离 \(\le 4\) 的一共有 \(49\) 个,所以实际边数至多为 \(49n^2\)(而且根本不可能跑满)。

所以时间复杂度为 \(O(49n^6)\)。

突然感觉用 \(FF\) 算法比 \(dinic\) 更优?

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=805,M=35005;
int n,m,de,s,t,id,h[N],d[N];
int k=1,to[M],w[M],nxt[M];
string st[N];int c[N],ans;
struct stone{int h,x,y;}a[N];
void add(int x,int y,int z){
w[++k]=z;to[k]=y;
nxt[k]=h[x];h[x]=k;
w[++k]=0;to[k]=x;
nxt[k]=h[y];h[y]=k;
}int bfs(){
memset(c,-1,sizeof(c));
queue<int>q;c[s]=0;
q.push(s);d[s]=h[s];
while(q.size()){
int x=q.front();q.pop();
for(int i=h[x];i;i=nxt[i]){
int y=to[i];int lv=w[i];
if(lv>0&&c[y]==-1){
c[y]=c[x]+1;d[y]=h[y];
q.push(y);if(y==t) return 1;
}
}
}return 0;
}int dfs(int x,int ans){
if(x==t) return ans;
int sum=ans;
for(int i=d[x];i&&sum;i=nxt[i]){
d[x]=i;int y=to[i];int lv=w[i];
if(lv<1||c[y]!=c[x]+1) continue;
int zjy=dfs(y,min(sum,lv));
sum-=zjy;w[i]-=zjy;w[i^1]+=zjy;
}return ans-sum;
}int dinic(){
int re=0;
while(bfs())
re+=dfs(s,1e9);
return re;
}int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m>>de;
for(int i=1;i<=n;i++){
string t;cin>>t;t=" "+t;
for(int j=1;j<=m;j++){
if(t[j]=='0') continue;
a[++id]={t[j]-'0',i,j};
}
}for(int i=1;i<=n;i++)
cin>>st[i],st[i]=" "+st[i];
s=id*2+1;t=id*2+2;
for(int i=1;i<=id;i++){
int ru=i*2-1,ch=i*2;
double x=a[i].x,y=a[i].y;
add(ru,ch,a[i].h);
if(st[(int)x][(int)y]!='.')
add(s,ru,1),ans++;
if(x<=de||y<=de||x+de>n||y+de>m)
add(ch,t,1e7);
for(int j=1;j<=id;j++){
if(i==j) continue;
double z=a[j].x,w=a[j].y;
if((x-z)*(x-z)+(y-w)*(y-w)<=de*de)
add(ch,j*2-1,1e7);
}
}cout<<ans-dinic();
return 0;
}

[SCOI2007] 蜥蜴 题解的更多相关文章

  1. 洛谷P2472 [SCOI2007]蜥蜴 题解

    题目链接: https://www.luogu.org/problemnew/show/P2472 分析: 这道题用最大流解决. 首先构建模型. 一根柱子可以跳入和跳出,于是拆成两个点:入点和出点. ...

  2. 题解 P2472 【[SCOI2007]蜥蜴】

    P2472 [SCOI2007]蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱 ...

  3. [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴

    [BZOJ1066][luogu_P2472][SCOI2007]蜥蜴 试题描述 在一个 \(r\) 行 \(c\) 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥 ...

  4. bzoj1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...

  5. 1066: [SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3545  Solved: 1771[Submit][Status] ...

  6. BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴

    与POJ 1815 Friendship类似,该题之前也做过 目前处于TLE状态.样例已经通过 1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit:  ...

  7. 【bzoj1066】[SCOI2007]蜥蜴 网络最大流

    [bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...

  8. BZOJ 1066: [SCOI2007]蜥蜴( 最大流 )

    结点容量..拆点然后随便写 --------------------------------------------------------------- #include<cstdio> ...

  9. P2472 [SCOI2007]蜥蜴(网络流)

    P2472 [SCOI2007]蜥蜴 把每个点拆成2个点,两点之间连边的边权为石柱高度 新建虚拟源点$S$和汇点$T$ $S$向所有有蜥蜴的点连边,边权1 其他边都连$inf$ 剩下就是裸的$dini ...

  10. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

随机推荐

  1. feign 使用

    feign 是netflix 提供的申明式的httpclient调用框架 整合方法 1.添加依赖 <dependency> <groupId>org.springframewo ...

  2. Element-UI 调整

    1.对话框 当打开的对话框页面元素众多,俨然一个iframe页面时,可以做2个优化: 滚动条:对话框去滚动,当对话框内容过多时,把滚动条控制在对话框内部,避免出现页面级的滚动条 标题栏:优化对话框标题 ...

  3. Winform多线程持续读取PLC数据

    1.Winform窗体界面 2.后台代码 点击查看代码 using Modbus.Device; using System; using System.Collections.Generic; usi ...

  4. uniapp权限判断

    写法如下 // 检查是否有写入外部存储的权限 function writeExternalStoragePermission() { return new Promise((resolve, reje ...

  5. .NET开发规范v1.0

    一. 编程规范 (一) 命名风格 命名要找更有表现力的词,更专业的词,比如获取数据不用get而使用fetch 别害怕长名称,长而具有描述性的名称比短而令人费解的名称好 为作用域大的名字采用更长的名字, ...

  6. sqlserver配置分发实现主备

    方案总体说明 本方案采用"发布-订阅模式" 由主服务器进行发布消息,备份服务器进行订阅 当主服务器数据发生变更时,就会发布消息,备份服务器读取消息进行同步更新,中间过程延迟比较短. ...

  7. go编译可以指定os和arch

    是的,Go 编译器支持通过环境变量来指定目标操作系统(OS)和架构(Arch).这允许你为不同的平台交叉编译 Go 程序.你可以使用 GOOS 和 GOARCH 环境变量来指定目标系统. 例如,如果你 ...

  8. Spring Security OAuth2 - 自定义 OAuth2.0 令牌发放接口地址

    登录实现拿浏览器网页登录举例: 基于 OAuth2.0-密码模式 实现网页登录的本质就是浏览器通过 /oauth/token 接口将 用户名 和 密码 等信息传给后台, 然后后台验证通过后返回一个有效 ...

  9. Qt/C++视频监控拉流显示/各种rtsp/rtmp/http视频流/摄像头采集/视频监控回放/录像存储

    一.前言 本视频播放组件陆陆续续写了6年多,一直在持续更新迭代,视频监控行业客户端软件开发首要需求就是拉流显示,比如给定一个rtsp视频流地址,你需要在软件上显示实时画面,其次就是录像保存,再次就是一 ...

  10. Qt音视频开发27-Onvif设备搜索

    一.前言 最近业余时间主要研究音视频开发这块,前面的文章写了好多种视频监控内核,一旦将这些内核搞定以后,视频监控的相关功能水到渠成.做视频监控系统,绕不过onvif这玩意,这玩意主要就是为了统一一个大 ...