[bzoj1066] [SCOI2007] 蜥蜴 - 网络流
在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃
到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石
柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不
变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个
石柱上。
Input
输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱
,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。
Output
输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。
Sample Input
5 8 2
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........
Sample Output
1
题解:徐趱鹏大佬一眼看出了裂点,的确,这种题目,自己有一个承受量的,一般需要裂点成一个终点,一个起点,然后流量为承受量,
然后就是S->入点无限流量,出点->终点无限流量去流。
这一道题目,建模型不难,关键在于代码实现建边,十分复杂,参考了hzw。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define N 1007
#define inf 1000000007
using namespace std; int r,c,d,S,T;
int cnt=,head[N],next[N*N],rea[N*N],val[N*N];
int ans,mp[][],mark[][];
int dis[N]; void add(int u,int v,int fee)
{
cnt++;
next[cnt]=head[u];
head[u]=cnt;
rea[cnt]=v;
val[cnt]=fee;
}
bool judge(int x1,int y1,int x2,int y2)
{
if(((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))<=(d*d)&&mp[x1][y1]&&mp[x2][y2]) return ;
return ;
}
void build()
{
for(int x1=;x1<=r;x1++)
for(int y1=;y1<=c;y1++)
for(int x2=x1-d;x2<=x1+d;x2++)
for(int y2=y1-d;y2<=y1+d;y2++)
if(judge(x1,y1,x2,y2)&&(x1!=x2||y1!=y2)) add(mark[x1][y1]+r*c,mark[x2][y2],inf),add(mark[x2][y2],mark[x1][y1]+r*c,);
for(int i=;i<=r;i++)
for(int j=;j<=c;j++)
if(mp[i][j]) add(mark[i][j],mark[i][j]+r*c,mp[i][j]),add(mark[i][j]+r*c,mark[i][j],);
}
bool bfs()
{
memset(dis,-,sizeof(dis));
dis[S]=;
queue<int>q;
q.push(S);
while (!q.empty())
{
int u=q.front();
q.pop();
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i],cost=val[i];
if (dis[v]==-&&cost>)
{
dis[v]=dis[u]+;
if (v==T) return ;
q.push(v);
}
}
}
return ;
}
int dfs(int u,int MM)
{
int res=;
if (u==T||MM==) return MM;
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i],fee=val[i];
if (dis[v]!=dis[u]+) continue;
int x=dfs(v,min(MM,fee));
if (x)
{
val[i]-=x,val[i^]+=x;
MM-=x,res+=x;
if (MM==) break;
}
}
return res;
}
int dinic()
{
int res=;
while (bfs())
{
int x=dfs(S,inf);
while (x)
{
res+=x;
x=dfs(S,inf);
}
}
return res;
}
int main()
{
memset(head,-,sizeof(head));
scanf("%d%d%d",&r,&c,&d);
int INK=r*c;
S=INK*+,T=INK*+;
char ch[];
for(int i=;i<=r;i++)
{
scanf("%s",ch+);
for(int j=;j<=c;j++)
mp[i][j]=ch[j]-'';
}
int tot=;
for(int i=;i<=r;i++)
for(int j=;j<=c;j++)
tot++,mark[i][j]=tot;
for(int i=;i<=r;i++)
{
scanf("%s",ch+);
for(int j=;j<=c;j++)
if(ch[j]=='L') {add(S,mark[i][j],),add(mark[i][j],S,);ans++;}
}
for(int i=;i<=d;i++)
for(int j=d+;j<=r-d;j++)
{
add(mark[j][i]+INK,T,inf),add(T,mark[j][i]+INK,);
add(mark[j][c-i+]+INK,T,inf),add(T,mark[j][c-i+]+INK,);
}
for(int i=;i<=d;i++)
for(int j=;j<=c;j++)
{
add(mark[i][j]+INK,T,inf),add(T,mark[i][j]+INK,);
add(mark[r-i+][j]+INK,T,inf),add(T,mark[r-i+][j]+INK,);
}
build();
int res=dinic();
printf("%d",ans-res);
}
[bzoj1066] [SCOI2007] 蜥蜴 - 网络流的更多相关文章
- BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP
由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html
- BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】
BZOJ1066 SCOI2007 蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离 ...
- bzoj千题计划135:bzoj1066: [SCOI2007]蜥蜴
http://www.lydsy.com/JudgeOnline/problem.php?id=1066 每个柱子拆成两个点 i<<1,i<<1|1,之间连流量为高度的边 如果 ...
- bzoj1066: [SCOI2007]蜥蜴(最大流)
1066: [SCOI2007]蜥蜴 题目:传送门 题解: 哇QTT大佬一眼秒算法...ORT 其实很容易就可以看出来是一道最大流 因为有边的使用限制,那么就可以直接当成是流量来处理嘛 因为是对点进行 ...
- BZOJ1066 [SCOI2007]蜥蜴
首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...
- bzoj 1066 : [SCOI2007]蜥蜴 网络流
题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...
- 【bzoj1066】[SCOI2007]蜥蜴 网络最大流
[bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流
[bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...
随机推荐
- if __name__ == '__main__' 到底是何方神圣(转)
想必很多初次接触python都会见到这样一个语句,if __name__ == "__main__": 那么这个语句到底是做什么用的呢?在解释之前,首先要声明的是,不管你是多么小白 ...
- java面向对象(二)之继承
继承 介绍 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.继承即常说的is-a关系.子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承 ...
- 利用HTML5的window.postMessage实现跨域通信
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp77 HTML5的window.postMessage简述 postM ...
- 1011. A+B和C (15)
/*1011. A+B和C (15) 时间限制150 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者HOU, Qiming给定区间[-231, 231]内的3个整数A ...
- vue-webpack-boilerplate分析
看完这篇文章你会学到通过vue-cli创建的项目,执行npm run dev后都发生了什么事情以及执行流程. 在创建vue项目时,官方推荐使用vue-cli这个命令行工具. # 全局安装 vue-cl ...
- 【2017集美大学1412软工实践_助教博客】团队作业7——Alpha冲刺之事后诸葛亮
题目 团队作业7: http://www.cnblogs.com/happyzm/p/6827853.html 团队成绩 评分项目 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 全组 ...
- java201521123118《java程序设计》第5周总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过 ...
- 201521123079《java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...
- 201521123014 《Java程序设计》第2周学习总结
1. 本周学习总结 (1)类Scanner 一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器. -例如以下代码使用户能够从System.in 中读取一个数: Scanner sc = ne ...
- 201521123005 《Java程序设计》 第十一周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 Q1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...