[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. linux grep 基本正则表达式与扩展正则表达式使用解析
  2. 获取当前横竖屏_Chrome扩展程序一键生成网页骨架屏
  3. 第一章:nginx环境搭建
  4. Oracle 的检查点队列 (checkpoint queue)
  5. MySQL-数据库增删改查
  6. php 多数据库联合查询,php如何同时连接多个数据库_PHP教程
  7. 【Java】Object基类
  8. Drools 7.11 :入门程序
  9. linux的创建线程池,Linux下通用线程池的创建与使用(上) (3)
  10. 如何在 Exchange Server 2010 SP1 下将用户邮箱导出到PST中
  11. 今天日期减去过去日期_汽车各零部件也有身份证,教你们如何看这些部件的quot;出生日期quot;...
  12. 通过phoenix导入数据到hbase出错记录
  13. Win32 Application 、Win32 Console Application、MFC工程项目
  14. python基础知识 01
  15. Eclipse配置android开发环境详解
  16. 结对项目——进一步完善四则运算
  17. 计算机软件图标乱码,Win7系统桌面快捷图标名称显示乱码如何解决
  18. php的thumb生成缩略图,php 生成缩略图
  19. Pytorch载入部分参数并冻结
  20. 使用Navicat将表设计导出数据库设计文档

热门文章

  1. pageX,clientX,offsetX,layerX的区别
  2. 强!chrome彻底关闭自动升级新方法实例演示,终于解决了chrome自动升级的烦恼
  3. Python 代码绘制航海王四皇大妈(BIG MOM) - 门卫大爷也能跟着学会的Turtle海龟绘图系列
  4. GRPC java实现demo
  5. 第7周项目实践2.1 用只有尾节点指针rear的循环单链表实现队列算法库
  6. 基于BP弱分类器用Adaboost的强分类器
  7. Ubuntu下安装node和npm
  8. LeetCode:2. Add Two Numbers
  9. jupyter 安装目录Table of Contents
  10. python推荐哪个系统好_什么是好的推荐系统?