[bzoj1066] [SCOI2007] 蜥蜴 - 网络流
在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃
到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石
柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不
变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个
石柱上。
Input
输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱
,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。
Output
输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。
Sample Input
5 8 2
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........
Sample Output
1
题解:徐趱鹏大佬一眼看出了裂点,的确,这种题目,自己有一个承受量的,一般需要裂点成一个终点,一个起点,然后流量为承受量,
然后就是S->入点无限流量,出点->终点无限流量去流。
这一道题目,建模型不难,关键在于代码实现建边,十分复杂,参考了hzw。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define N 1007
#define inf 1000000007
using namespace std; int r,c,d,S,T;
int cnt=,head[N],next[N*N],rea[N*N],val[N*N];
int ans,mp[][],mark[][];
int dis[N]; void add(int u,int v,int fee)
{
cnt++;
next[cnt]=head[u];
head[u]=cnt;
rea[cnt]=v;
val[cnt]=fee;
}
bool judge(int x1,int y1,int x2,int y2)
{
if(((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))<=(d*d)&&mp[x1][y1]&&mp[x2][y2]) return ;
return ;
}
void build()
{
for(int x1=;x1<=r;x1++)
for(int y1=;y1<=c;y1++)
for(int x2=x1-d;x2<=x1+d;x2++)
for(int y2=y1-d;y2<=y1+d;y2++)
if(judge(x1,y1,x2,y2)&&(x1!=x2||y1!=y2)) add(mark[x1][y1]+r*c,mark[x2][y2],inf),add(mark[x2][y2],mark[x1][y1]+r*c,);
for(int i=;i<=r;i++)
for(int j=;j<=c;j++)
if(mp[i][j]) add(mark[i][j],mark[i][j]+r*c,mp[i][j]),add(mark[i][j]+r*c,mark[i][j],);
}
bool bfs()
{
memset(dis,-,sizeof(dis));
dis[S]=;
queue<int>q;
q.push(S);
while (!q.empty())
{
int u=q.front();
q.pop();
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i],cost=val[i];
if (dis[v]==-&&cost>)
{
dis[v]=dis[u]+;
if (v==T) return ;
q.push(v);
}
}
}
return ;
}
int dfs(int u,int MM)
{
int res=;
if (u==T||MM==) return MM;
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i],fee=val[i];
if (dis[v]!=dis[u]+) continue;
int x=dfs(v,min(MM,fee));
if (x)
{
val[i]-=x,val[i^]+=x;
MM-=x,res+=x;
if (MM==) break;
}
}
return res;
}
int dinic()
{
int res=;
while (bfs())
{
int x=dfs(S,inf);
while (x)
{
res+=x;
x=dfs(S,inf);
}
}
return res;
}
int main()
{
memset(head,-,sizeof(head));
scanf("%d%d%d",&r,&c,&d);
int INK=r*c;
S=INK*+,T=INK*+;
char ch[];
for(int i=;i<=r;i++)
{
scanf("%s",ch+);
for(int j=;j<=c;j++)
mp[i][j]=ch[j]-'';
}
int tot=;
for(int i=;i<=r;i++)
for(int j=;j<=c;j++)
tot++,mark[i][j]=tot;
for(int i=;i<=r;i++)
{
scanf("%s",ch+);
for(int j=;j<=c;j++)
if(ch[j]=='L') {add(S,mark[i][j],),add(mark[i][j],S,);ans++;}
}
for(int i=;i<=d;i++)
for(int j=d+;j<=r-d;j++)
{
add(mark[j][i]+INK,T,inf),add(T,mark[j][i]+INK,);
add(mark[j][c-i+]+INK,T,inf),add(T,mark[j][c-i+]+INK,);
}
for(int i=;i<=d;i++)
for(int j=;j<=c;j++)
{
add(mark[i][j]+INK,T,inf),add(T,mark[i][j]+INK,);
add(mark[r-i+][j]+INK,T,inf),add(T,mark[r-i+][j]+INK,);
}
build();
int res=dinic();
printf("%d",ans-res);
}
[bzoj1066] [SCOI2007] 蜥蜴 - 网络流的更多相关文章
- BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP
由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html
- BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】
BZOJ1066 SCOI2007 蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离 ...
- bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴
http://www.lydsy.com/JudgeOnline/problem.php?id=1066 每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边 如果 ...
- bzoj1066: [SCOI2007]蜥蜴(最大流)
1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...
- BZOJ1066 [SCOI2007]蜥蜴
首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...
- bzoj 1066 : [SCOI2007]蜥蜴 网络流
题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...
- 【bzoj1066】[SCOI2007]蜥蜴 网络最大流
[bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流
[bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...
随机推荐
- python编码错误的解决办法 SyntaxError: Non-ASCII character '\xe5' in file
[提出问题]. 在编写Python时,当使用中文输出或注释时运行脚本,会提示错误信息: SyntaxError: Non-ASCII character '\xe5' in file ******* ...
- 实战案例--TEMPDB暴涨
前言 tempdb暴增,造成磁盘空间不足,甚至影响业务运行. 正文 如图,tempdb log文件从7.40开始突然暴涨,因为 tempdb 0 M到 40G tempdb 所 ...
- 《Java从入门到放弃》JavaSE入门篇:面向对象语法二(入门版)
想了半天,发现单独的封装和多态没什么好讲的,我们就简单说说Java里面对应的语法吧. 相关内容如下: 一.访问修饰符 二.getter/setter方法 三.构造方法 四.super和this 五.s ...
- LVS-NAT搭建HTTP及HTTPS
author:JevonWei 版权声明:原创作品 搭建NAT模式的HTTP环境 网络拓扑图如下 网络环境 RS1 192.168.198.138 RS2 192.168.198.120 LVS: D ...
- Java filter拦截器的使用
1.web.xml配置 <!-- 验证是否登录 拦截功能 --> <filter> <filter-name>isLogin</filter-name> ...
- 第1阶段——uboot分析之通过nand命令读内核(8)
本节主要学习: 详细分析UBOOT中"bootcmd=nand read.jffs2 0x30007FC0 kernel;bootm 0x30007FC0" 怎么实现nand命令读 ...
- Java Object中的equals和hashCode
Java的Object对象中有两个方法比较有意思,一个是equals(),一个是hashCode(),那么这两个的作用有些同学可能还不是很清楚,那么同学们现在就进一步了解一下吧. 下面咱们写一个简单的 ...
- eclipse+git
最近朋友都推荐使用github管理自己的项目,而且免费用户可以有5个仓库,恰好我也想了解下git,借此机会学习一下.github官方指南使用独立第三方git工具来进行版本控制,并不借助于eclipse ...
- dreamweaver代码提示失效
原文地址:dreamweaver代码提示失效作者:云中雁 2007-03-23 12:19:22| 分类: 编程手记 | 标签:web2.0 javascript |字号大中小 订阅 吴庆民 ...
- 【集美大学1411_助教博客】团队作业6——展示博客(Alpha版本)
写在前面的话 工作还真是应该抓紧做呢,以下评分是助教在出差前评的,但出差回来就忘记了大部分内容.同学们都在预期时间内完成了自己的alpha项目.由于助教的频繁出差,评分工作落下一大截,在此表示欠意,会 ...