BZOJ1066_蜥蜴_KEY
经过长时间的旅行,很长时间没写过博客了,这次把上次WA的题目过了。
由于每次蜥蜴从石柱上跳下时,石柱的高度会-1,可以看做占了一格的流量。
建图:
1.建超级源和超级汇,设超级源连到每只蜥蜴的边容量为1,每个可以跳到外面的点连到超级汇的边的容量为maxlongint。
2.对于每个点建一个虚点,连边到此虚点,边容量为该点石柱高度。对于每个可以互相跳到的点,建立容量为maxlongint的边。这样当前点到其他点的总容量为该点的石柱高度。(拆点)
然后跑一遍Dinic就好了。
注意用蜥蜴的总数减去最大流才是答案。
code:
/**************************************************************
Problem: 1066
User: yekehe
Language: C++
Result: Accepted
Time:40 ms
Memory:6380 kb
****************************************************************/ #include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
using namespace std; int r,c,d,a[][],L;
string S; int head[],nxt[],W[],To[],cnt;
void add(int x,int y,int c)
{
W[cnt]=c;
To[cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
cnt++;
} int check(int x,int y,int fx,int fy)
{
return (x-fx)*(x-fx)+(y-fy)*(y-fy)<=d*d;
} int l[],dist[];
int BFS()
{
int tl=,hd=;
hd=tl=;
l[++tl]=;
memset(dist,-,sizeof dist);
dist[]=;
while(hd<tl){
int front=l[++hd];
for(int i=head[front];i!=-;i=nxt[i]){
if(dist[To[i]]==- && W[i]){
dist[To[i]]=dist[front]+;
l[++tl]=To[i];
}
}
}
return dist[r*c*+]!=-;
} int DFS(int now,int x)
{
if(now==r*c*+ || !x)return x;
int res=;
for(int i=head[now];i!=- && x;i=nxt[i]){
if(dist[now]+==dist[To[i]]&&W[i]){
int DK=DFS(To[i],min(x,W[i]));
W[i]-=DK;W[i^]+=DK;
x-=DK;res+=DK;
}
}
if(!res)dist[now]=-;
return res;
} void Dinic()
{
int ans=;
while(BFS())
ans+=DFS(,2e9);
printf("%d",L-ans);
return ;
} int main()
{
// freopen("x.txt","r",stdin);
scanf("%d%d%d",&r,&c,&d);
memset(nxt,-,sizeof nxt);
memset(head,-,sizeof head);
register int i,j,k,h;
#define Size ( r*c )
#define fr ( (i-1)*c+j )
#define to ( (k-1)*c+h )
for(i=;i<=r;i++){
cin>>S;
for(j=;j<S.size();j++){
a[i][j+]=S[j]-'';
}
}
for(i=;i<=r;i++){
cin>>S;
for(j=;j<=S.size();j++){
if(S[j-]=='L'){
L++;//求蜥蜴总数
add(,fr,);
add(fr,,);
}
}
}
for(i=;i<=r;i++)
for(j=;j<=c;j++){
if(!a[i][j])continue;
add(fr,fr+Size,a[i][j]);
add(fr+Size,fr,);
for(k=;k<=r;k++)
for(h=;h<=c;h++){
if(i==k&&j==h)continue;
if(a[k][h]/*减少边的总量*/&&check(i,j,k,h)){
add(fr+Size,to,2e9);
add(to,fr+Size,);
}
}
}
for(i=;i<=r;i++)
for(j=;j<=c;j++){
if(i<=d || j<=d || r-i+<=d || c-j+<=d){
if(!a[i][j])continue;//减少边的总量
add(fr+Size,Size<<|,2e9);
add(Size<<|,fr+Size,);
}
}
Dinic();
return ;
}
BZOJ1066_蜥蜴_KEY的更多相关文章
- 1066: [SCOI2007]蜥蜴
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3545 Solved: 1771[Submit][Status] ...
- bzoj 1066 蜥蜴
最大流. 建图:首先将每根柱子拆成两个点. 每根柱子的入点向出点连一条容量为柱子高度的边. 每根柱子的出点向可以到达的柱子的入点连一条容量为正无穷的边. 源点向每根初始有蜥蜴的柱子的入点连一条容量为一 ...
- BZOJ 1066 【SCOI2007】 蜥蜴
Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为$1$,蜥蜴的跳跃距离是d,即蜥蜴可以跳 ...
- 蜥蜴(bzoj 1066)
Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平 ...
- BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...
- BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴
与POJ 1815 Friendship类似,该题之前也做过 目前处于TLE状态.样例已经通过 1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: ...
- 【bzoj1066】[SCOI2007]蜥蜴 网络最大流
[bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...
- 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...
- BZOJ1066 [SCOI2007]蜥蜴
首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...
随机推荐
- 贝叶斯网络(Bayesian network))简介(PRML第8.1节总结)概率图模型(Graphical models)
转:http://www.cnblogs.com/Dzhouqi/p/3204353.html 部分图为手写,由于本人字很丑,望见谅,只是想把PRML书的一些部分总结出来,给有需要的人看,希望能帮到一 ...
- CodeIgniter框架学习要点
以下内容从兄弟连的CI教学视频中摘抄: http://codeigniter.org.cn/tutorials/ ------------------------------------------- ...
- Java实现身份证号码验证源码分享
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- springmvc小结(上)
1.springmvc的整体结构以及流程 ①.前端控制器:只需要在web.xml文件中配置即可 作用:接受请求,处理响应结果,转发器,中央处理器 ②.处理器映射器:根据请求的url找到相应的Handl ...
- HDU 1053 Entropy(哈夫曼编码 贪心+优先队列)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1053 Entropy Time Limit: 2000/1000 MS (Java/Others) ...
- Oracle 创建触发器实现自增长
Oracle中没有主键,要实现自增长,需要创建触发器,每次插入数据的时候进行ID赋值. 环境:Oracle11,Navicat工具连接 创建了一个表,字段如下(字段名,表名都需要大写,你小写了还无效. ...
- Oracle 常用脚本
ORACLE 默认用户名密码 sys/change_on_install SYSDBA 或 SYSOPER 不能以 NORMAL 登录,可作为默认的系统管理员 system/manager SYSDB ...
- iOS之动态计算文字的高度
+ (CGSize)boundingALLRectWithSize:(NSString *)txt Font:(UIFont *)font Size:(CGSize)size { NSMutableA ...
- MySQL常用参数说明(持续更新)
##innodb correlate innodb_flush_log_at_trx_commit value: 0,[1],2 effect: control the flush opera ...
- layer 刷新某个页面
一:使用layer.open打开的子页面 window.parent.location.reload()//刷新父页面 var index = parent.layer.getFrameIndex(w ...