蜥蜴-DInic
题目背景
07四川省选
题目描述
在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。
每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。
输入输出格式
输入格式:
输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。
输出格式:
输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。
输入输出样例
输入样例#1:
5 8 2 00000000 02000000 00321100 02000000 00000000 ........ ........ ..LLLL.. ........ ........
输出样例#1:
1
说明
100%的数据满足:1<=r, c<=20, 1<=d<=3
写代码时犯了三个错误
*注意柱子间建边条件。满足条件:不在同一列 或 不在同一行 不是既 在同一列 或 不在同一行。
*读入的是字符。
*出图条件。
*数组大小。至多有400个点。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<math.h> using namespace std; #define M 99893535 int c,r,d,dd,s,t,tot,na[100][100],ans,m1[100][100],dep[9200],map[1010][1010]; char m2[400][400]; int dfs(int u,int t,int f) { if(u==t) return f; int d; for(int v=1;v<=tot;v++) if(map[u][v]>0&&dep[v]==dep[u]+1&&(d=dfs(v,t,min(f,map[u][v])))) { map[u][v]-=d; map[v][u]+=d; return d; } return 0; } int bfs(int s=1,int t=2) { queue<int>q;q.push(s); memset(dep,-1,sizeof(dep)); dep[s]=0; while(!q.empty()){ int u=q.front();q.pop(); for(int v=1;v<=tot;v++) if(map[u][v]>0&&dep[v]==-1) { dep[v]=dep[u]+1; q.push(v); } } return dep[t]!=-1; } int dinic() { int flow=0,f=0; while(bfs(1,2)) while(1){ f=dfs(1,2,M); if(!f) break; flow+=f; } return flow; } void find(int x,int y) { int now=na[x][y]+1; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) if( (i!=x||j!=y) &&m1[i][j]>0) if(d*d>= ((x-i)*(x-i)+(y-j)*(y-j)) ) map[now][ na[i][j] ]=M; } int main() { s=1,t=2,tot=2; scanf("%d%d%d",&r,&c,&d); for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { char oo; cin>>oo; m1[i][j]=oo-'0'; if(m1[i][j]) { int w=na[i][j]=++tot;tot++; map[w][w+1]=m1[i][j]; } } char o; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { cin>>o; m2[i][j]=o; if(o=='L') { int w=na[i][j]; map[s][w]=1; ans++; } } for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) if(m1[i][j]) { find(i,j); if(i<=d||j<=d||(r-i+1)<=d||(c-j+1)<=d) map[ na[i][j]+1 ][t]=M ; } printf("%d",ans-dinic()); return 0; }