在一个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] 蜥蜴 - 网络流的更多相关文章

  1. BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP

    由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html

  2. BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】

    BZOJ1066 SCOI2007 蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离 ...

  3. bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边 如果 ...

  4. bzoj1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...

  5. BZOJ1066 [SCOI2007]蜥蜴

    首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...

  6. bzoj 1066 : [SCOI2007]蜥蜴 网络流

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

  7. 【bzoj1066】[SCOI2007]蜥蜴 网络最大流

    [bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...

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

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

  9. 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流

    [bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...

随机推荐

  1. 使用jmeter执行多条sql语句

    注意2个地方 1. [JDBC Connection Configuration] 在配置DataBase URL的时候,加上allowMultiQueries=true参数如: jdbc:MySQL ...

  2. SVG图案

    前面的话 给SVG元素应用填充和描边,除了使用纯色和渐变外,还可以使用图案.本文将详细介绍SVG图案 概述 <pattern>可以实现重复的效果,在canvas中被翻译为模式,而在SVG中 ...

  3. MySQL的JOIN(二):JOIN原理

    表连接算法 Nested Loop Join(NLJ)算法: 首先介绍一种基础算法:NLJ,嵌套循环算法.循环外层是驱动表,循坏内层是被驱动表.驱动表会驱动被驱动表进行连接操作.首先驱动表找到第一条记 ...

  4. JAVA HashMap的实现原理

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt359 1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存 ...

  5. django源码解析一(请求处理流程)

    1.我们都知道WSGI是一个规范,规范了server和application之间通信的一些约束,server端在监听到请求之后,会把请求转给application去处理,他们之间关联起来的桥梁是一个e ...

  6. 裸机LCD驱动配置

    横屏4.3寸LCD为480*272(行:480个像素点        列:272个行) 1.1  LCD原理图 : Pin1:Von  电源正(这里由硬件自动控制) Pin2:VM/VDEN 数据使能 ...

  7. Linux下设置Tomcat虚拟路径

    问题描述:我在上传图片的位置不在Tomcat服务器下,用户无法访问 解决方案:配置Tomcat虚拟路径使用户可以访问图片 配置Tomcat # cd /usr/local/apache-tomcat- ...

  8. 想做iPhoneX抢购活动?压测大师先教你优化网站后台

    北京时间9月13日凌晨1点,iPhone 10周年,在Apple Park乔布斯剧院,苹果发布了三款新iPhone.全面屏iPhone X来袭,这款被定义为未来的智能手机黑科技满满:全面屏,无线充电. ...

  9. WEB跨域资源共享:Cross-origin Resource Sharing(CORS)

    跨域资源共享(CORS):浏览器同源策略中的同源指协议+域名+端口三者完全一致,其中任何一个不同即为跨域 1. 浏览器同源政策是隔离潜在恶意文件的安全机制,限制信息传递和使用的边界,不是信息的保密机制 ...

  10. JavaScript 的使用基础总结②DOM

    HTML DOM 通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HT ...