SCOI2007——蜥蜴(最大流)
来源:互联网 发布:淘宝店铺消失是假货吗 编辑:程序博客网 时间:2024/05/16 15:24
1066: [SCOI2007]蜥蜴
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 914 Solved: 427
[Submit][Status][Discuss]
Description在一个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
HINT
100%的数据满足:1<=r, c<=20, 1<=d<=3
Source
Pku 2711 Leapin' Lizards
解析:
还是比较容易看出来是最大流。。。求无法逃脱的最小值即求可以逃脱的最大值。。。
把每个点拆成入点和出点。。。有数字的格子就在入点和出点之间连容量为map[i][j]的边
对于有蜥蜴的点,从原点连容量为一的边到该点的入点。。。
可以跳出去的点,连一条容量为inf的边。。。
对于地图内可到达的点,从出点到另一个点的入点连容量为inf的边。。。
代码:
#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;#define inf 1000000000int r,c,dd,tot=0,l=0,e=0,t;int map[30][30],val[1000];int head[10000],ad,sum=0;struct node{ int u,v,c,next;}edge[100000];int d[10000],sumd[10000];void add(int u,int v,int c){ //printf("%d %d %d\n",u,v,c); edge[e].u=u; edge[e].v=v; edge[e].c=c; edge[e].next=head[u]; head[u]=e++; edge[e].u=v; edge[e].v=u; edge[e].c=0; edge[e].next=head[v]; head[v]=e++;}void read(){ freopen("Lizard.in","r",stdin); freopen("Lizard.out","w",stdout); scanf("%d%d%d\n",&r,&c,&dd); t=r*c*2+1; ad=r*c; memset(head,-1,sizeof(head)); for(int i=1;i<=r;i++) { for(int j=1;j<=c;j++) { char op; scanf("%c",&op); map[i][j]=op-'0'; int cnt=(i-1)*c+j; if(map[i][j]!=0) add(cnt,cnt+ad,map[i][j]); if(map[i][j]!=0&&(i<=dd||i+dd>r||j<=dd||j+dd>c))add(cnt+ad,t,inf); } scanf("\n"); } for(int i=1;i<=r;i++) { for(int j=1;j<=c;j++) { char op; scanf("%c",&op); ++l; if(op=='L'){add(0,l,1);sum++;} } scanf("\n"); }}int sap(int u,int flow){ if(u==t)return flow; int res=0; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(edge[i].c && d[u]==d[v]+1) { int t=sap(v,min(edge[i].c,(flow-res))); res+=t; edge[i].c-=t;edge[i^1].c+=t; if(res==flow)return res; if(d[0]>=t+1)return res; } } sumd[d[u]]--; if(sumd[d[u]]==0)d[0]=t+1; sumd[++d[u]]++; return res;}double dis(int x,int y,int x1,int y1){ return sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));}void work(){ for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { int cnt=(i-1)*c+j; if(map[i][j]) { int st,ed; for(int k=1;k<=r;k++) for(int z=1;z<=c;z++) if(map[k][z]&&(dis(i,j,k,z)<=(double)dd)&&cnt!=c*(k-1)+z) add(cnt+ad,c*(k-1)+z,inf); } } sumd[0]=t+1; int ans=0; while(d[0]<=t) ans+=sap(0,inf); printf("%d\n",sum-ans);}int main(){ read(); work(); return 0;}
- SCOI2007——蜥蜴(最大流)
- 【SCOI2007】【最大流】蜥蜴
- [最大流]BZOJ 1066——[SCOI2007]蜥蜴
- bzoj 1066: [SCOI2007]蜥蜴 (最大流)
- bzoj 1066: [SCOI2007]蜥蜴(最大流)
- bzoj1066: [SCOI2007]蜥蜴 最大流
- [BZOJ1066]SCOI2007蜥蜴|最大流
- 【BZOJ1066】[SCOI2007]蜥蜴【最大流】
- [最大流] BZOJ1066: [SCOI2007]蜥蜴
- [bzoj1066][SCOI2007]蜥蜴 最大流
- (bzoj 1066 [SCOI2007]蜥蜴)<网络最大流>
- bzoj1066 [SCOI2007]蜥蜴(建图最大流)
- bzoj1066 —— [SCOI2007]蜥蜴
- 【最大流】[SCOI2007]蜥蜴 BZOJ 1066
- BZOJ 1066: [SCOI2007]蜥蜴 网络最大流
- Bzoj 1066: [SCOI2007]蜥蜴(最大流)
- BZOJ 1066: [SCOI2007]蜥蜴 最大流
- 【Dinic求最大流】BZOJ1066 [SCOI2007]蜥蜴
- HTTP协议解析
- shell的if与c语言if的功能上的区别
- Java编码过滤器的编写
- 二分模板以及STL中的查找
- 临时对象
- SCOI2007——蜥蜴(最大流)
- XNA 3.1 TO XNA 4.0 Conversion Cheat Sheet
- 41.windbg-调试技巧(解决Type information missing error for)
- mysql 实现 rownum
- 基于嵌入式Linux的MP3播放器的设计与实现
- 红黑树及其插入
- VC++杂七杂八
- android---------区分Activity的四种加载模式
- 学习杂记--- 贫血 充血 sql join