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

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

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

    JSON 是用于存储和传输数据的格式. JSON 通常用于服务端向网页传递数据 . 什么是 JSON? JSON 英文全称 JavaScript Object Notation JSON 是一种轻量级 ...

  2. 实现windows和linux互传文件

    http://www.cnblogs.com/ylan2009/archive/2012/01/12/2321126.html 尝试从windows xp向ubuntu11.10传文件 ubuntu使 ...

  3. jquery ajax 报交请求返回 HTTP 400 错误

    提交请求的AJAX代码如下: 点击(此处)折叠或打开 $.ajax({ url: "${ctx}/selfhelp/userAttributeAnalysis/userAttributeLi ...

  4. 从零开始学android开发-详细谈谈intent的startActivityForResult()方法

    1.两种实现activity跳转的方法 实现activity的跳转主要有两种方法,startActivity()和startActivityForResult();例如activity A跳转到act ...

  5. BZOJ 1090: [SCOI2003]字符串折叠 区间DP

    1090: [SCOI2003]字符串折叠 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  6. SpringMVC+Spring3+hibernate4 开发环境搭建以及一个开发实例教程

    刚刚接触了SpringMVC这个框架,因此有必要把它拿过来同hibernate.Spring框架进行集成和开发一个实例,在真正企业从头开发的项目中往往一个稳定的开发环境至关重要,开发一个项目选择什么样 ...

  7. debian 系统备份

    tar -zcvpf /home/full-backup.tar.gz / --exclude=/mnt/* --exclude=/proc/* --exclude=/sys/* 这个命令是把根目录下 ...

  8. FastDFS配置过程

    在我的生产环境中利用FastDFS实现动静分离的方案

  9. Log4net - 规则简介(续)

    之前对于配置并没有结束, 中间插了一个demo进去, 能够更直观的看到日志是怎么使用的. 这一篇, 我加了一些自己的东西进去, 可以更直观的来理解这些配置内容. 这里就继续介绍配置文件中的内容. 1. ...

  10. Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...