这道题还是挺好想的,但我一开始还是想错了……

把每个石柱拆成两个点,一个入度,一个出度,两个点连一条容量为高度的边,这样就可以限制从此石柱上经过的蜥蜴的数量。关于蜥蜴是否单独成点,我是单独当成了一个点,貌似做麻烦了,可以直接源点连石柱,但那样我想会不会造成一些问题,貌似也没有。

虽然很水,但还是调了很久。主要问题出在建图上,我把一个点拆成了高度个点,这样无法达到上面说的限制蜥蜴经过的数量这个功能,所以WA了很久,看了题解,才突然明白,这么搞不行……

代码如下:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#define N 25
#define inf 1<<30
using namespace std; struct sss
{
int x,y;
}xiyi[N*N];
int n,m,S,T,d;
int a[N][N]={},num[N][N]={},stonenum=,xiyinum=;
int p[N*N*],next[N*N*N*N*],v[N*N*N*N*],f[N*N*N*N*],bnum=-; bool kexing(int x,int y)
{
if (x<||x>n||y<||y>m) return false;
else return true;
} void addbian(int x,int y,int flow)
{
bnum++; next[bnum]=p[x];
p[x]=bnum; v[bnum]=y; f[bnum]=flow;
bnum++; next[bnum]=p[y];
p[y]=bnum; v[bnum]=x; f[bnum]=;
} int dis[N*N*]; bool BFS()
{
int i,j,k;
queue<int> q;
for (i=;i<=T;i++) dis[i]=-;
dis[S]=; q.push(S);
while (!q.empty())
{
j=q.front(); q.pop(); k=p[j];
while (k!=-)
{
if (f[k]&&dis[v[k]]==-)
{
dis[v[k]]=dis[j]+;
q.push(v[k]);
}
k=next[k];
}
}
if (dis[T]==-) return false;
else return true;
} int DFS(int now,int change)
{
int i,j,k,flow=;
if (now==T||change==) return change;
k=p[now];
while (k!=-)
{
if (f[k]&&dis[v[k]]==dis[now]+&&(i=DFS(v[k],min(change,f[k])))>)
{
f[k]-=i; f[k^]+=i;
flow+=i; change-=i;
if (change==) break;
}
k=next[k];
}
dis[now]=-;
return flow;
} int dinic()
{
int ans=,flow;
while (BFS())
while (flow=DFS(S,inf))
ans+=flow;
return ans;
} bool bianjie(int x,int y)
{
if (x<=d||y<=d) return true;
else if (n-x<d||m-y<d) return true;
else return false;
} int main()
{
int i,j,k,x,y;
char s[N];
scanf("%d%d%d",&n,&m,&d);
S=n*m*+; T=n*m*+;
for (i=;i<=T;i++) p[i]=-;
for (i=;i<=n;i++)
{
scanf("%s",s);
for (j=;j<m;j++)
if (s[j]!='') a[i][j+]=s[j]-'';
}
for (i=;i<=n;i++)
{
scanf("%s",s);
for (j=;j<m;j++)
if (s[j]=='L')
{
xiyinum++; a[i][j+]--;
xiyi[xiyinum].x=i; xiyi[xiyinum].y=j+;
}
}
for (i=;i<=n;i++)
for (j=;j<=m;j++)
if (a[i][j]>)
{
stonenum++;
num[i][j]=stonenum;
}
for (i=;i<=n;i++)
for (j=;j<=m;j++)
if (a[i][j]>)
{
addbian(num[i][j],num[i][j]+n*m,a[i][j]);
if (bianjie(i,j))
addbian(num[i][j]+n*m,T,inf);
for (int I=-d;I<=d;I++)
for (int J=-d;J<=d;J++)
if (!(I==&&J==)&& I*I+J*J<=d*d)
{
x=i+I; y=j+J;
if (kexing(x,y)&&a[x][y])
addbian(num[i][j]+n*m,num[x][y],inf);
}
}
for (i=;i<=xiyinum;i++)
{
int x1=xiyi[i].x,y1=xiyi[i].y;
addbian(S,i+n*m*,);
if (bianjie(x1,y1))
addbian(i+n*m*,T,inf);
for (int I=-d;I<=d;I++)
for (int J=-d;J<=d;J++)
if (!(I==&&J==)&& I*I+J*J<=d*d)
{
x=x1+I; y=y1+J;
if (kexing(x,y)&&a[x][y])
addbian(i+n*m*,num[x][y],inf);
}
}
printf("%d\n",xiyinum-dinic());
}

bzoj 1066: [SCOI2007] 蜥蜴的更多相关文章

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

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

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

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

  3. [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】

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

  4. poj 2711 Leapin' Lizards && BZOJ 1066: [SCOI2007]蜥蜴 最大流

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

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

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1066 [题目大意] 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些 ...

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

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

  7. 1066: [SCOI2007]蜥蜴

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

  8. 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...

  9. 1066: [SCOI2007]蜥蜴 - BZOJ

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

随机推荐

  1. dotnetfx35.exe

    http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe

  2. 如何使用Linux通用后门(转zafe)

    特别提示:仅用于安全测试和教学,禁止非法用途. 标题党了,呵呵 其实就是个ssh后门,基本可以不用看内核版本,很简单,为照顾新手! ********************************** ...

  3. MVC返回http状态码

    //controller ); //asp.net return HttpStatusCode.OK

  4. ThinkPHP CURD方法盘点:limit方法

    limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多.ThinkPHP的limit方法可以兼容所有的数据库驱动类的. 用法 限制结果数量 例如获取满足 ...

  5. cdoj 92 Journey tarjan/lca 树上点对距离

    Journey Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/92 Descri ...

  6. [ES6] ES6 Parameter Object Destructuring with Required Values

    Not only can you provide default values when using ES6 parameter object destructuring, but you can a ...

  7. iOS开发——高级技术&广告功能的实现

    广告功能的实现 iPhone/iPad的程序,即使是Free的版本,也可以通过广告给我们带来收入.前提是你的程序足够吸引人,有足够的下载量.这里,我将介绍一下程序中集成广告的方法.主要有两种广告iAd ...

  8. php递归无限极分类

    递归无限级分类有几种形式,我这里仅仅举例比較经常使用的三种: 第一种:返回有排序的数组: <?php $data = array( 1 => array( 'id' => 1, 'p ...

  9. el表达式跟ognl表达式的区别(转)

    EL表达式: >>单纯在jsp页面中出现,是在四个作用域中取值,page,request,session,application.>>如果在struts环境中,它除了有在上面的 ...

  10. 查看MAC系统JRE和JDK版本

    经常有些软件有JRE或者JDK的版本要求,但怎么查询MAC上现在的JRE或JDK的版本呢?很简单,用这两个命令 这个是查询JRE的版本: $ java -version java version &q ...