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

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

虽然很水,但还是调了很久。主要问题出在建图上,我把一个点拆成了高度个点,这样无法达到上面说的限制蜥蜴经过的数量这个功能,所以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. cocos2d-x 纹理研究

    转自:http://blog.csdn.net/qq51931373/article/details/9119161 1.通常情况下用PVR格式的文件来进行图片显示的时候,在运行速度和内存消耗方面都要 ...

  2. <转>使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机

    准备 今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2 ...

  3. iOS 时间戳转换为时间

    NSString *str=";//时间戳 NSTimeInterval time=[str doubleValue]+;//因为时差问题要加8小时 == 28800 sec NSDate ...

  4. httpclient模拟浏览器訪问站点

    HttpClient 是 Apache Jakarta Common 下的子项目.能够用来提供高效的.最新的.功能丰富的支持 HTTP 协议的client编程工具包.而且它支持 HTTP 协议最新的版 ...

  5. Android中定时器的3种实现方法

    原文:http://blog.csdn.net/wulianghuan/article/details/8507221 在Android开发中,定时器一般有以下3种实现方法: 一.采用Handler与 ...

  6. [React Fundamentals] Component Lifecycle - Mounting Basics

    React components have a lifecycle, and you are able to access specific phases of that lifecycle. Thi ...

  7. 离线安装Cloudera Manager5.3.4与CDH5.3.4(二)

    Cloudera Manager Server和Agent所有后发先至.也能够进行CDH5的安装和配置. 然后,主节点可以通过浏览器访问7180port测试(因为CM Server需要花时间来启动,可 ...

  8. iOS开发——网络编程OC篇&(二)XMPP实现用户登录与注销

    XMPP实现用户登录与注销 登录: 步骤: * 在AppDelegate实现登录 1. 初始化XMPPStream 2. 连接到服务器[传一个JID] 3. 连接到服务成功后,再发送密码授权 4. 授 ...

  9. java_实现接口的枚举类

    package ming; interface GenderDoc { void info(); } enum Gender implements GenderDoc { // public stat ...

  10. 第一章 02 谈谈static关键词

    引文一下吧 http://blog.csdn.net/hackbuteer1/article/details/7487694 一.static在C语言中的含义 1.静态变量作用范围在一个文件内,程序开 ...