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

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

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

    一些好用的nginx第三方模块 转自;http://macken.iteye.com/blog/1963301  1.Development Kit https://github.com/simpl/ ...

  2. Android开发日志问题

    以前在Android开发中发现,日志打印好多,调试的时候各种加Log,之后就各种不删除,导致项目后期花大把时间删除日志打印. 学到一个好方法: 在所有尽可能高的父类里面加上一个常量 DEBUG ,一开 ...

  3. 安装Windows SDK7.1时发生的一个错误(附解决办法)

    A problem occurred while installing selected Windows SDK components. Installation of the "Micro ...

  4. 【项目经验】如何用TexturePacker & Physicseditor开发游戏

    首先感谢Andreas的license.先广告一下Andreas. ------------------------------------------------------------------ ...

  5. 自学JavaScript笔记

    最近看了一段时间的<JavaScipt高级编程设计>由于记性不是很好,经常性的看了又忘记:想一些文字整理在自己的博客上,方便没事都可以拿出来看一下: 第一章 JavaScript概述   ...

  6. Linux 学习笔记 基本的bash shell命令

    Linux 文件系统 Linux讲文件存储在单个目录结构(虚拟目录)中,虚拟目录包含了安装在PC上的所有存储设备的文件路径. Linux虚拟目录中比较复杂的部分是它如何来协调管理各个存储设备.Linu ...

  7. Java基础知识强化之IO流笔记70:Properties练习之 如何让猜数字小游戏只能玩5次的案例

    1. 使用Properties完成猜数字小游戏只能玩5次的案例: 2. 代码实现: (1)猜数字游戏GuessNumber: package cn.itcast_08; import java.uti ...

  8. 有关<action android:name="android.intent.action.DELETE" />

    今天看一个病毒样本时遇到了这个Action,位于一个Activity节点下 通过真机测试与导师指导发现,这个Action的作用就相当于把其所在的应用加入到了“系统卸载程序”列表,当你卸载系统中的任一应 ...

  9. jquery通过ajax方法获取json数据不执行success回调

    问题描述:jquery通过ajax方法获取json数据不执行success回调方法 问题原因:json格式存在问题或不符合标准写法,导致总是执行error回调方法 解决方案:使json格式务必符合下述 ...

  10. [转]修改maven本地仓库路径

    从eclipse中增加了maven2的插件之后,maven默认的本地库的路径是${user}/.m2/repository/下,一般windows用户的操作系统都安装在C盘,所以这个目录下的jar包比 ...