「BZOJ1066」[SCOI2007]蜥蜴
1 #include<bits/stdc++.h> 2 #define myp pair<int,int> 3 #define mp make_pair 4 using namespace std; 5 const int N=30,N2=900,dx[4]={-1,0,1,0},dy[4]={0,1,0,-1},oo=2e9; 6 int n,m,d,tot,super_s,super_t,h[N][N],sum; 7 inline int getid(int a,int b){return (a-1)*m+b;} 8 inline int getdis(int x1,int y1,int x2,int y2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);} 9 struct Edge{ 10 int from,to,flow,cap; 11 Edge(int _from=0,int _to=0,int _flow=0,int _cap=0):from(_from),to(_to),flow(_flow),cap(_cap){} 12 }; 13 vector<Edge>edge; 14 vector<int>point[N2]; 15 int edge_tot; 16 void add_edge(int f,int t,int c){ 17 // cout<<f<<" "<<t<<" "<<c<<endl; 18 edge.push_back(Edge(f,t,0,c)); 19 point[f].push_back(edge_tot++); 20 edge.push_back(Edge(t,f,0,0)); 21 point[t].push_back(edge_tot++); 22 return; 23 } 24 int dis[N][N]; 25 int level[N2]; 26 bool d_bfs(){ 27 memset(level,0,sizeof(level)); 28 queue<int>q; 29 int x; 30 q.push(super_s); 31 level[super_s]=1; 32 while(!q.empty()){ 33 x=q.front();q.pop(); 34 for(int i=0;i<point[x].size();i++){ 35 if(edge[point[x][i]].cap<=edge[point[x][i]].flow) continue; 36 if(!level[edge[point[x][i]].to]){ 37 level[edge[point[x][i]].to]=level[x]+1; 38 q.push(edge[point[x][i]].to); 39 } 40 } 41 } 42 return level[super_t]; 43 } 44 int dfs(int k,int a){ 45 if(!a||k==super_t) return a; 46 int ans=0,temp,x; 47 for(int i=0;i<point[k].size();i++){ 48 Edge& e=edge[point[k][i]]; 49 x=edge[point[k][i]].to; 50 if(level[x]==level[k]+1&&edge[point[k][i]].cap>edge[point[k][i]].flow&&(temp=dfs(x,min(a,edge[point[k][i]].cap-edge[point[k][i]].flow)))){ 51 ans+=temp,a-=temp; 52 edge[point[k][i]].flow+=temp,edge[point[k][i]^1].flow-=temp; 53 if(!a) return ans; 54 } 55 } 56 return ans; 57 } 58 int dinic(){ 59 int ans=0; 60 while(d_bfs()) ans+=dfs(super_s,oo); 61 return ans; 62 } 63 int main(){ 64 int t1; 65 char c[30]; 66 scanf("%d%d%d",&n,&m,&d); 67 tot=n*m,super_s=tot+tot+1,super_t=super_s+1; 68 for(int i=1;i<=n;i++){ 69 scanf("%s",&c); 70 for(int j=1;j<=m;j++){ 71 h[i][j]=c[j-1]-'0'; 72 if(h[i][j]){t1=getid(i,j);add_edge(t1,t1+tot,h[i][j]);} 73 } 74 } 75 for(int i=1;i<=n;i++) 76 for(int j=1;j<=m;j++) if(h[i][j]){ 77 if(i<d+1||j<d+1||i+d>n||j+d>m) add_edge(getid(i,j)+tot,super_t,oo); 78 for(int ii=1;ii<=n;ii++) 79 for(int jj=1;jj<=m;jj++)if(h[ii][jj]&&getdis(i,j,ii,jj)<=d*d) add_edge(getid(i,j)+tot,getid(ii,jj),oo); 80 } 81 for(int i=1;i<=n;i++){ 82 scanf("%s",&c); 83 for(int j=1;j<=m;j++){ 84 if(c[j-1]=='L'){ 85 add_edge(super_s,getid(i,j),1); 86 sum++; 87 } 88 } 89 } 90 printf("%d\n",sum-dinic()); 91 return 0; 92 }