BZOJ 1066 [SCOI2007]蜥蜴(最大流)

时间:2022-10-24 23:30:26

【题目链接】 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]蜥蜴(最大流)的更多相关文章

  1. BZOJ 1066&colon; &lbrack;SCOI2007&rsqb;蜥蜴&lpar; 最大流 &rpar;

    结点容量..拆点然后随便写 --------------------------------------------------------------- #include<cstdio> ...

  2. poj 2711 Leapin&&num;39&semi; Lizards &amp&semi;&amp&semi; BZOJ 1066&colon; &lbrack;SCOI2007&rsqb;蜥蜴 最大流

    题目链接:http://poj.org/problem?id=2711 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1066 Your p ...

  3. POJ 2711 Leapin&&num;39&semi; Lizards &sol; HDU 2732 Leapin&&num;39&semi; Lizards &sol; BZOJ 1066 &lbrack;SCOI2007&rsqb;蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

  4. &lbrack;BZOJ 1066&rsqb; &lbrack;SCOI2007&rsqb; 蜥蜴 【最大流】

    题目链接:BZOJ - 1066 题目分析 题目限制了高度为 x 的石柱最多可以有 x 只蜥蜴从上面跳起,那么就可以用网络流中的边的容量来限制.我们把每个石柱看作一个点,每个点拆成 i1, i2,从 ...

  5. bzoj 1066&colon; &lbrack;SCOI2007&rsqb; 蜥蜴

    这道题还是挺好想的,但我一开始还是想错了…… 把每个石柱拆成两个点,一个入度,一个出度,两个点连一条容量为高度的边,这样就可以限制从此石柱上经过的蜥蜴的数量.关于蜥蜴是否单独成点,我是单独当成了一个点 ...

  6. bzoj 1066 &colon; &lbrack;SCOI2007&rsqb;蜥蜴 网络流

    题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...

  7. 1066&colon; &lbrack;SCOI2007&rsqb;蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3545  Solved: 1771[Submit][Status] ...

  8. &lbrack;SCOI2007&rsqb; 蜥蜴 &lpar;最大流&rpar;

    [SCOI2007] 蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1 ...

  9. P2472 &lbrack;SCOI2007&rsqb;蜥蜴 &lpar;最大流&rpar;

    题目 P2472 [SCOI2007]蜥蜴 解析 这个题思路比较清晰,本(qi)来(shi)以(jiu)为(shi)无脑建图跑最大流,结果挂了,整了一个小时后重新建图才过的. 建立一个超级源点和一个超 ...

随机推荐

  1. Linux laptop-mode 电池供电时鼠标间歇失灵问题解决

    /*本文地址http://www.cnblogs.com/go2bed/p/4298689.html */ 这个问题网上已经有很多人讨论过了.例如<解决ubuntu使用笔记本自带电池后鼠标断电或 ...

  2. &period;NET易忘备留 ORACLE存储过程调用

    1.Oracle存储过程调用[返回信息,单体或者列表] public IResult FundBuild(string partnerId,string userId, DateTime beginD ...

  3. lnmp 在nginx中配置相应的错误页面error&lowbar;page

    1. 创建自己的404.html页面 2.更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on; 3.更改nginx.conf(或单独网站配置文件, ...

  4. nginx lua 开发笔记

    获取 在lua代码中获取 location 正则的参数对应的变量 // location location ~/lua_http_2/(\w*.+) { } // lua local vars=ngx ...

  5. 对于crontab定时任务不能自动执行的总结

    最近遇到了一些sh不能在crontab定时任务中自动执行的问题 期间由于不太了解,故走了一点弯路,现在总结下来可能第一次 进行设置遇到的问题.以绝后患!我所用过的操作系统为HP-unix&li ...

  6. vue&period;js项目构建

    这里构建的vue.js项目依赖node服务器运行. 项目搭建完整步骤: 安装node.js ,转至nodeJs网站http://nodejs.cn/ 下载nodeJs进行安装. 安装完毕检查nodeJ ...

  7. &lbrack;Bzoj 2956&rsqb; 模积和 &lpar;整除分块&rpar;

    整除分块 一般形式:\(\sum_{i = 1}^n \lfloor \frac{n}{i} \rfloor * f(i)\). 需要一种高效求得函数 \(f(i)\) 的前缀和的方法,比如等差等比数 ...

  8. ubuntu系统界面改变

    主题:https://gitzab.com/Anduin/GNOME-OSX-II-Theme.git图标:https://github.com/keeferrourke/la-capitaine-i ...

  9. FastDFS 学习笔记

      一.理论基础 FastDFS比较适合以中小文件为载体的在线服务,比如跟NGINX(APACHE)配合搭建图片服务器. 分布式文件系统FastDFS FastDFS是纯C语言实现,只支持Linux. ...

  10. spring注解式参数校验

    很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者返回异常时的校验信息,在代码中相当冗长,今天我们就来学习spring注解式参数校验. 其实就是:hibernate的validator. 开始啦. ...