[SCOI2007] 蜥蜴

题目背景

07四川省选

题目描述

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

每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。

输入输出格式

输入格式:

输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石柱的初始状态,0表示没有石柱,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。

输出格式:

输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。

输入输出样例

输入样例#1:

5 8 2
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........

输出样例#1:

1

说明

100%的数据满足:\(1<=r, c<=20, 1<=d<=4\)

Solution

看到题目中的柱子每经过一次高度-1马上想到网络流,每根柱子的高度就是网络中一条边的容量

其实网络流的题目一般就是考建边,建完以后套个最大流模板就行了

那么怎么建边呢?

建一个源点S,汇点T(都是虚点)

  1. 考虑拆点,我们把一个柱子拆成入点和出点,把这两个点之间建一条容量为柱子高度x的边,代表这棵柱子最多只能经过x次
  2. 对于能够到达地图外的点,我们之间从它的出点向汇点建一条容量为inf的边
  3. 枚举两个柱子,在地图上欧几里得距离小于最大跳跃距离的点之间建一条容量为inf的边
  4. 由源点向每个蜥蜴所在的点建一条容量为1的边,代表这个点有一个蜥蜴

Code

#include<bits/stdc++.h>
#define rg register
#define il inline
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b)
#define dis(a,b,x,y) ((x-a)*(x-a)+(y-b)*(y-b))
using namespace std;const int N=100,M=1e6+10;
const int inf=2e9;void in(int &ans) {ans=0; char i=getchar();while(i<'0' || i>'9') i=getchar();while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar();
}int n,m,d,cur=1,ans;
int S,T,NN,c1,c2,sum;
char ch;
int to[M<<1],nex[M<<1],head[M],cap[M<<1],lev[M],curr[M];
int c[N][N],p[N][N];
int l[M<<1],r[M<<1];struct node {int l,r;
};
vector<node>v;il void add(int a,int b,int c) {to[++cur]=b,nex[cur]=head[a];cap[cur]=c,head[a]=cur;
}il void read() {NN=n*m; T=2*n*m+1;for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {cin>>ch;  p[i][j]=++c1;c[i][j]=ch-'0';if(c[i][j]) l[++c2]=i,r[c2]=j;}}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) {cin>>ch; if(ch=='L') sum++,v.push_back((node){i,j});}
}il void init() {for(int i=1;i<=c2;i++) {add(p[l[i]][r[i]],p[l[i]][r[i]]+NN,c[l[i]][r[i]]);add(p[l[i]][r[i]]+NN,p[l[i]][r[i]],0);if(l[i]<=d || r[i]<=d || l[i]+d>n || r[i]+d>m) {add(p[l[i]][r[i]]+NN,T,inf);add(T,p[l[i]][r[i]]+NN,0);}}for(int i=1;i<=c2;i++)for(int j=1;j<=c2;j++) {if(dis(l[i],r[i],l[j],r[j])<=d*d && i!=j) {add(p[l[i]][r[i]]+NN,p[l[j]][r[j]],inf);add(p[l[j]][r[j]],p[l[i]][r[i]]+NN,0);}}for(int i=0;i<sum;i++) {add(S,p[v[i].l][v[i].r],1);add(p[v[i].l][v[i].r],S,0);}
}bool bfs(int s,int t) {queue<int>q; memset(lev,-1,sizeof(lev));q.push(s); lev[s]=0;while(!q.empty()) {int u=q.front(); q.pop();for(int i=head[u];i;i=nex[i]) {if(lev[to[i]]==-1 && cap[i]>0) {lev[to[i]]=lev[u]+1;q.push(to[i]);}}}return lev[t]!=-1;
}int dfs(int s,int f,int t,int rest=0) {if(s==t) return f;for(int i=head[s];i;i=nex[i]) {if(lev[to[i]]==lev[s]+1 && cap[i]>0) {int r=dfs(to[i],Min(cap[i],f-rest),t);if(r>0) rest+=r,cap[i]-=r,cap[i^1]+=r;}}if(!rest) lev[s]=-1;return rest;
}int main()
{in(n),in(m),in(d);read(); init();while(bfs(S,T))while(int c=dfs(S,inf,T)) ans+=c;printf("%d\n",sum-ans);return 0;
}

博主蒟蒻,随意转载.但必须附上原文链接

http://www.cnblogs.com/real-l/

转载于:https://www.cnblogs.com/real-l/p/9622334.html

[SCOI2007] 蜥蜴 (最大流)相关推荐

  1. 洛谷 - P2472 [SCOI2007]蜥蜴(最大流)

    题目链接:点击查看 题目大意:给出一个 n * m 的迷宫,每个位置都有一个耐久度,也就是至多经过 a[ i ][ j ] 位置 ( i , j ),现在迷宫中有一些蜥蜴,每一时刻在每一个位置至多有一 ...

  2. bzoj 1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4116  Solved: 2081 [Submit][Statu ...

  3. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...

  4. BZOJ1066: [SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4506  Solved: 2305 [Submit][Statu ...

  5. BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec   Memory Limit: 162 MB Submit: 2947   Solved: 1471 [ Submit][ S ...

  6. 1066. [SCOI2007]蜥蜴【最大流】

    Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃 到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到 ...

  7. LuoguP2472 SCOI2007 蜥蜴

    蒟蒻第二篇博客,恶补网络流之后决定整个活 题目链接 目录 一.模型建立 二.注意事项 三.AC代码 总结 一.模型建立 网络流 这道题的难点在于它的限制是在点上而不是在边上,那我们考虑如何把点的限制转 ...

  8. [SCOI2007]蜥蜴 (网格图经典四方向建边)

    题意: 在一个n*m的矩阵中,每个格子都有一定的高度,当高度为0时表示该格子不存在,现在这个矩阵中有若干只蜥蜴,每只蜥蜴跳到格子上时,该格子的高度会减一,每只蜥蜴可以跳跃直线距离不大于D的长度,问最少 ...

  9. BZOJ 1066[SCOI2007]蜥蜴

    学了ISAP说我来做一道网络流的傻逼题吧然后自己变成了一个傻逼.. De了很久的bug然后发现我从源点向每只蜥蜴连了INF的边,喵喵喵? 最近写博客好像比较敷衍,还是说一下.每个柱子拆点,源点向每个有 ...

最新文章

  1. MinkowskiEngine语义分割
  2. js 时间戳与日期处理集合
  3. [Android] 通过GridView仿微信动态添加本地图片
  4. T-SQL中的随机数
  5. linux命令行tcp连接,linux下2个检查tcp连接的命令
  6. linux kill进程后黑屏,Linux中Kill进程的N种方法
  7. 空间留言软件_电脑硬盘空间提示不足,原来还可以这么做,真是学到老活到老...
  8. javascript表单处理相关的知识总结(一)
  9. 为什么微信、Facebook都在做企业通信软件
  10. 《Python机器学习——预测分析核心算法》——2.2 分类问题:用声纳发现未爆炸的水雷...
  11. 机器学习基础:K近邻算法(Machine Learning Fundamentals: KNN)
  12. Jrebel激活服务,Jrebel激活,Jrebel激活码,Jrebel破解
  13. 美术集网校—多点透视如何运用于绘画中?学会透视增加绘画体积感!
  14. C# 利用winrar解压带密码的压缩包
  15. 第五太阳纪终结,人类文明新开端?
  16. MATLAB的Monte Carlo方法,Monte Carlo的某些用法总结_monte carlo
  17. 【格式化文档】ISO27001控制措施+ISO27002实施指南 【上】
  18. 信用风险频发背后:11月约600亿信用债发行取消
  19. 空间分辨率和灰度分辨率
  20. 前有莫雷,今有清华学霸要求公开华人程序员自杀真相,被Facebook开除了

热门文章

  1. Python 微信机器人-用itchat库向好友发送名片、转发名片实例演示
  2. 解决MPLAB X IDE的文件注释出现乱码的问题
  3. Altium designer 操作笔记
  4. Altium Designer将Gerber转换为PCB文件教程
  5. manacher马拉车算法
  6. php 自增,php 根据自增id创建唯一编号类
  7. 【Kaggle-MNIST之路】CNN+改进过的损失函数(三)
  8. TensorFlow安装【2018/12更新】+文档查询以及栏目配置(Windows)
  9. TCP实现在不同局域网下的两台电脑网络通信(Python实现)
  10. React兄弟组件之间通信