BZOJ 1066 [SCOI2007]蜥蜴(最大流)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1066
【题目大意】
在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,
你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为1,
蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。
石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1
(如果仍然落在地图内部,则到达的石柱高度不变),
如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。
任何时刻不能有两只蜥蜴在同一个石柱上。
【题解】
我们将相互可达的点连线,建立源点,往有蜥蜴在的石柱连流量为1的边,
建立汇点,把能一次跳到外面的点和汇点连流量无穷的边。
拆点,将点可经过次数作为边权以限制通过,求最大流即最多能逃脱的蜥蜴数量
【代码】
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAX_V=1000;
struct edge{int to,cap,rev;};
vector<edge> G[MAX_V];
int level[MAX_V],iter[MAX_V];
void add_edge(int from,int to,int cap){
G[from].push_back((edge){to,cap,G[to].size()});
G[to].push_back((edge){from,0,G[from].size()-1});
}
void bfs(int s){
memset(level,-1,sizeof(level));
queue<int> que;
level[s]=0;
que.push(s);
while(!que.empty()){
int v=que.front(); que.pop();
for(int i=0;i<G[v].size();i++){
edge &e=G[v][i];
if(e.cap>0&&level[e.to]<0){
level[e.to]=level[v]+1;
que.push(e.to);
}
}
}
}
int dfs(int v,int t,int f){
if(v==t)return f;
for(int &i=iter[v];i<G[v].size();i++){
edge &e=G[v][i];
if(e.cap>0&&level[v]<level[e.to]){
int d=dfs(e.to,t,min(f,e.cap));
if(d>0){
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}return 0;
}
int max_flow(int s,int t){
int flow=0;
for(;;){
bfs(s);
if(level[t]<0)return flow;
memset(iter,0,sizeof(iter));
int f;
while((f=dfs(s,t,INF))>0){
flow+=f;
}
}
}
vector<int> res;
char mp[30][30],MP[30][30];
int vis[30][30];
int n,m,d;
void solve(){
int s=n*m*2,t=s+1,cnt=0;
for(int i=0;i<=t;i++)G[i].clear();
for(int i=0;i<n;i++)scanf("%s",mp[i]);
for(int i=0;i<n;i++)scanf("%s",MP[i]);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
add_edge(i*m+j,i*m+j+n*m,mp[i][j]-'0');
if(MP[i][j]=='L')add_edge(s,i*m+j,1),cnt++;
if(i<d||j<d||n-i<=d||m-j<=d)add_edge(i*m+j+n*m,t,INF);
}
}for(int i=0;i<n;i++)for(int j=0;j<m;j++){
for(int k=0;k<n;k++)for(int u=0;u<m;u++){
if(abs(i-k)+abs(u-j)<=d&&(i!=k||j!=u)){
add_edge(i*m+j+n*m,k*m+u,INF);
add_edge(k*m+u+n*m,i*m+j,INF);
}
}
}
printf("%d\n",cnt-max_flow(s,t));
}
int main(){
while(~scanf("%d%d%d",&n,&m,&d)){
solve();
}return 0;
}
BZOJ 1066 [SCOI2007]蜥蜴(最大流)的更多相关文章
- BZOJ 1066: [SCOI2007]蜥蜴( 最大流 )
结点容量..拆点然后随便写 --------------------------------------------------------------- #include<cstdio> ...
- poj 2711 Leapin' Lizards && BZOJ 1066: [SCOI2007]蜥蜴 最大流
题目链接:http://poj.org/problem?id=2711 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1066 Your p ...
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】
题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 ...
- bzoj 1066: [SCOI2007] 蜥蜴
这道题还是挺好想的,但我一开始还是想错了…… 把每个石柱拆成两个点,一个入度,一个出度,两个点连一条容量为高度的边,这样就可以限制从此石柱上经过的蜥蜴的数量.关于蜥蜴是否单独成点,我是单独当成了一个点 ...
- bzoj 1066 : [SCOI2007]蜥蜴 网络流
题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...
- 1066: [SCOI2007]蜥蜴
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3545 Solved: 1771[Submit][Status] ...
- [SCOI2007] 蜥蜴 (最大流)
[SCOI2007] 蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1 ...
- P2472 [SCOI2007]蜥蜴 (最大流)
题目 P2472 [SCOI2007]蜥蜴 解析 这个题思路比较清晰,本(qi)来(shi)以(jiu)为(shi)无脑建图跑最大流,结果挂了,整了一个小时后重新建图才过的. 建立一个超级源点和一个超 ...
随机推荐
- Tornado 安装及简单程序示例
1.安装步骤:tar xvzf tornado-3.2.tar.gz cd tornado-3.2 python setup.py build sudo python setup.py install ...
- springcloud基于ribbon的canary路由方案
思路 根据eureka的metadata进行自定义元数据,然后使用ribbon对该元数据进行过滤和匹配,选择server. 实现 这里使用header来传递路由信息,改造ribbon-discover ...
- 转 一次完整地http请求
作者:斯巴达克斯 时间:January 11, 2014 分类:WEB 声明:本文章中的说法仅是个人理解总结,不一定完全正确,但是可以有助于理解. 关于HTTP协议可以参考以下: HTTP协议漫谈 h ...
- mysql 设置字符集
可以用:show create table table_name查看建表信息 也可用: show create database database_name查看建库信息 mysql> creat ...
- Mac iphone 使用 如何修改apple 用户名 XXX的mac Mac 与iphone如何连接 传递文件 为iphone增加铃声 iphone铃声的制作---城
1.更改mac apple id Apple ID 即用户名称,您可以将其用于与 Apple 有关的所有操作.为某个 Apple 服务(如 iCloud 或 App Store)创建帐户时即创建了 A ...
- FineReport——JS二次开发(自定义翻页按钮)
FR允许自定义工具栏上面的按钮,并提交JS方法: 对于翻页功能,大概有首页,下一页,上一页,最后一页,以及跳转页等功能. 不得不说的是,在HTML页面自定义的按钮如何获取到报表模板,通过FR提供的JS ...
- 如何让Footer无论页面长短都在最底部, 并和正文保持固定高度?
html结构: <div id="container"> <div id="content">页面正文</div> < ...
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- SQL Server 用链接服务器 同步SqlServer与MySQL
=======================================================================================SQL SERVER链接S ...
- Jmeter------查看JSON Extractor获取的值
在接口的使用中,我们会经常用到上个接口response中的值作为下个接口的参数来使用,因此我们为了确保值的正确性,需要知道上个接口返回的值是否正确,因此我们使用到了如下的方法来查看返回值. 1.首先在 ...