P2472 [SCOI2007]蜥蜴(网络最大流)
P2472 [SCOI2007]蜥蜴
题目描述
在一个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
网络最大流:
超级源点和汇点之间用蜥蜴连接
连边:
1、源点连开始的蜥蜴,只有一只,流量为1
2、蜥蜴和能跳过去的(大于1的)格子之间连边
利用公式\((x1-x2)(x1-x2)+(y1-y2)(y1-y2)\)和\(r*r\)进行比较
3.还有拆点,把点变成边,目的是限制过点的流量
4.边界点到t,流量为inf
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#define maxn 6000
#define N 6000
#define inf 0x3f3f3f3f
using namespace std;
char s[25];
int n,m,S,T,r;
inline int calc(int a,int b) {
return a*(m-1)+b;
}
struct node {
int v,next,cap;
} e[N<<2];
int head[N<<2],dis[N];
int tot=1;
void add(int x,int y,int z) {
e[++tot]=(node) {y,head[x],z};
head[x]=tot;
}
void addedge(int u,int v,int q) {
add(u,v,q);
add(v,u,0);
}
bool bfs() {
memset(dis,-1,sizeof(dis));
dis[S]=0;
queue<int> q;
q.push(S);
while(!q.empty()) {
int x=q.front();
q.pop();
for(int i=head[x]; i; i=e[i].next) {
int v=e[i].v;
if(dis[v]==-1&&e[i].cap) {
dis[v]=dis[x]+1;
q.push(v);
}
}
}
return dis[T]!=-1;
}
int dfs(int now,int f) {
if(now==T) return f;
int rest=f;
for(int i=head[now]; i; i=e[i].next) {
int v=e[i].v;
if(e[i].cap&&dis[v]==dis[now]+1&&rest) {
int t=dfs(v,min(rest,e[i].cap));
if(!t) dis[v]=0;
e[i].cap-=t;
e[i^1].cap+=t;
rest-=t;
}
}
return f-rest;
}
int dinic() {
int ans=0;
while(bfs())
ans+=dfs(S,inf);
return ans;
}
int number[20][20];
int map[21][21];
int main() {
/*从s到蜥蜴点
从蜥蜴到 可到蜥蜴
//拆点,容量为个数
从边界蜥蜴到t*/
scanf("%d%d%d",&n,&m,&r);
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
scanf("%1d",&map[i][j]);
int tot=0;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
number[i][j]=++tot;
S=0;
T=++tot;
int dsr_today_is_angry=0;
//number是拆点的前面,number+410是拆点的后边
for(int i=1; i<=n; ++i) {
scanf("%s",s+1);
for(int j=1; j<=m; ++j)
if(s[j]=='L') dsr_today_is_angry++,addedge(S,number[i][j],1);//s到蜥蜴 流量 1
}
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
if(map[i][j])
if(i-r<1||i+r>n||j-r<1||j+r>m)
addedge(410+number[i][j],T,inf);//蜥蜴到t 流量inf
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
if(map[i][j])
for(int ii=i-r; ii<=i+r; ++ii)
if(1<=ii&&ii<=n)
for(int jj=j-r; jj<=j+r; ++jj)
if(map[ii][jj])
if(i!=ii||j!=jj)
if(1<=jj&&jj<=m)
if((i-ii)*(i-ii)+(j-jj)*(j-jj)<=r*r)
addedge(number[i][j]+410,number[ii][jj],inf);//蜥蜴到蜥蜴 流量为inf
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(map[i][j]) addedge(number[i][j],number[i][j]+410,map[i][j]);//连起自己,流量为map
printf("%d",dsr_today_is_angry-dinic());
return 0;
}
P2472 [SCOI2007]蜥蜴(网络最大流)的更多相关文章
- P2472 [SCOI2007]蜥蜴(最大流)
P2472 [SCOI2007]蜥蜴 自己第一道独立做题且一遍AC的网络流题纪念... 看到这道题我就想到网络流建图的方式了... 首先根据每个高度,我们将每个点拆成两个点限流.之后根据跳的最大距离, ...
- 【bzoj1066】[SCOI2007]蜥蜴 网络最大流
[bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...
- P2472 [SCOI2007]蜥蜴 (最大流)
题目 P2472 [SCOI2007]蜥蜴 解析 这个题思路比较清晰,本(qi)来(shi)以(jiu)为(shi)无脑建图跑最大流,结果挂了,整了一个小时后重新建图才过的. 建立一个超级源点和一个超 ...
- P2472 [SCOI2007]蜥蜴(网络流)
P2472 [SCOI2007]蜥蜴 把每个点拆成2个点,两点之间连边的边权为石柱高度 新建虚拟源点$S$和汇点$T$ $S$向所有有蜥蜴的点连边,边权1 其他边都连$inf$ 剩下就是裸的$dini ...
- bzoj1066: [SCOI2007]蜥蜴(最大流)
1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...
- P2472 [SCOI2007]蜥蜴
传送门 求无法逃离的蜥蜴总数的最小值就是求最多逃离的蜥蜴总数 所以显然考虑最大流,一个流量的路径就相当于一只蜥蜴逃离的路径 发现每个位置有一个最大经过次数,所以把每个位置拆成两个点$x,y$,$x$ ...
- 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流
[bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...
- 【洛谷 P2472】 [SCOI2007]蜥蜴 (最大流)
题目链接 简单网络流. 源点向蜥蜴连流量为\(1\)的边. 能跳出去的点向汇点连流量为\(INF\)的边. 把每个点拆成\(2\)个点,\(O(n^4)\)枚举两两点,如果距离小于等于\(d\),就互 ...
- 洛谷P2472 [SCOI2007]蜥蜴 题解
题目链接: https://www.luogu.org/problemnew/show/P2472 分析: 这道题用最大流解决. 首先构建模型. 一根柱子可以跳入和跳出,于是拆成两个点:入点和出点. ...
随机推荐
- 莫队学习笔记(未完成QAQ
似乎之前讲评vjudge上的这题的时候提到过?但是并没有落实(...我发现我还有好多好多没落实?vjudge上的题目还没搞,然后之前考试的题目也都还没总结?天哪我哭了QAQ 然后这三道题我都是通过一道 ...
- Python yield 使用浅析(转)
add by zhj: 说到yield,就要说说迭代器.生成器.生成器函数. 迭代器:其实就是一个可迭代对象,书上说迭代器,我个人不喜欢这个说法,有点晦涩.可迭代对象基本上可以认为是有__iter__ ...
- javascript php 数组 json 对比 总结
看到这个博客,终于明白JavaScript 里只有一种 Array,不存在索引数组和关联数组. 1.在js中所有要素都是继承自Object对象的,任何对象都能通过obj["name" ...
- query:callback
function getName(callback) { setTimeout(function() { callback('Aaron') }, 1000) } //等待callback回调 get ...
- host文件常用地址
#+UPDATE_TIME 2016-02-16 19:52:05 UTC+8#+MESSAGE#################################################### ...
- HDU Today(自己的代码不知道哪里错了一直没A抄袭大神的)
http://acm.hdu.edu.cn/showproblem.php?pid=2112 本题题目意思非常简单,麻烦的就是处理一下字符串,这是我能力欠缺的地方 ;} 先把我有乱有麻烦的错误代码贴上 ...
- 机器学习理论基础学习3.5--- Linear classification 线性分类之朴素贝叶斯
一.什么是朴素贝叶斯? (1)思想:朴素贝叶斯假设 条件独立性假设:假设在给定label y的条件下,特征之间是独立的 最简单的概率图模型 解释: (2)重点注意:朴素贝叶斯 拉普拉斯平滑 ...
- Floyd 判圈算法
Floyd 判圈算法 摘自维基百科, LeetCode 上 141题 Linked List Cycle 用到这个, 觉得很有意思. 记录一下. 链接: https://zh.wikipedia.or ...
- testng入门教程5TestNG套件测试
TestNG套件测试 测试套件的测试是为了测试软件程序的行为或一系列行为的情况下,是一个集合.在TestNG,我们不能定义一套测试源代码,但它代表的套件是一个XML文件执行特征.这也允许灵活的配置要运 ...
- js模拟电梯操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...