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

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

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

    Asp.Net事务和异常处理: 一.什么是事务处理? 事务处理是一组组和成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将控制和维护每个数据库的一致性和完整性. 如果在事务过程中没有遇到错误, ...

  2. Android设计模式系列--原型模式

    CV一族,应该很容易理解原型模式的原理,复制,粘贴完后看具体情况是否修改,其实这就是原型模式.从java的角度看,一般使用原型模式有个明显的特点,就是实现cloneable的clone()方法.原型模 ...

  3. android常见错误-Unexpected namespace prefix "xmlns" found for tag LinearLayout

    有一次升级android开发工具后发现xml脚本出现错误“Unexpected namespace prefix "xmlns" found for tag LinearLayou ...

  4. android131 360 01 闪屏页和主页面

    主界面: 软件升级流程: 清单文件: <?xml version="1.0" encoding="utf-8"?> <manifest xml ...

  5. linux上安装ftp

    1.安装 rpm -ivh vsftpd-2.2.2-11.el6_4.1.x86_64.rpm 2.启动 service vsftpd start 3.连接 windows 命令行输入 ftp ww ...

  6. JS类型(2)_JS学习笔记(2016.10.02)

    undefined undefined是全局对象(window)的一个特殊属性,其值是未定义的.但 typeof undefined 返回 'undefined' . 虽然undefined是有特殊含 ...

  7. felx第二天 ActionScript 基本语法和关键字

    flex中使用的注解有两种分别是:// 和/**/ flex使用的关键字如图

  8. Java优先级队列实现

    优先级队列数组实现: public class PriorityQueue { private int[] data; private int size; public PriorityQueue(i ...

  9. 本地环境phpStorm10+XDebug配置和断点调试

    安装环境:XAMPP;phpStorm版本10; windows 7 64bit. XAMPP.phpStorm 都直接安装在了D盘根目录,9999m目录建在D:\xampp\htocts下,即目录工 ...

  10. 通过spring来配置某个命令号和执行方法之间的映射

    整理的内容 1.手动获取spring的ApplicationContext和bean对象 写一个工具类实现ApplicationContextAware接口 2.反射的知识整理 3.前后端协议交互的时 ...