bzoj1035 网络流
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
#define inf 0x3fffffff
#define maxn 40000
int e[maxn],v[maxn],ne[maxn],u[maxn];
int nn=-1;
void add(int x,int y,int z){
	ne[++nn]=e[x],e[x]=nn,v[nn]=y,u[nn]=z;
}
int s,t;
int ch[maxn];
bool tell(){
	memset(ch,-1,sizeof(ch));
   queue<int> jj;
   jj.push(s);
   ch[s]=0;
   while(!jj.empty()){
	   int x=jj.front();
	   jj.pop();
	   for(int i=e[x];i!=-1;i=ne[i]){
			if(u[i]&&ch[v[i]]==-1){
			  ch[v[i]]=ch[x]+1;
			  jj.push(v[i]);	
			}
		}	
	}	
	if(ch[t]==-1)return 0;
	return 1;
}
int d;
int zeng(int x,int mm){
	if(x==t)return mm;
	int r=mm,l;
	for(int i=e[x];i!=-1&&r;i=ne[i])if(u[i]&&ch[v[i]]==ch[x]+1){
		l=zeng(v[i],min(r,u[i]));
		u[i]-=l;
		u[i^1]+=l;
		r-=l;
	}
	if(mm==r)ch[x]=-1;
	return mm-r;
}
int dinic(){
	int r=0,tt;
	while(tell()){
		while(tt=zeng(s,inf))r+=tt;
	}
	return r;
}
int dist(int x1,int y1,int x2,int y2){
  return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
int n,c;
int main(){
	memset(e,-1,sizeof(e));
	scanf("%d%d%d",&n,&c,&d);
	for(int i=0;i<n;i++)for(int j=0;j<c;j++){
		char a;
		scanf(" %c",&a);
		add(((i*c+j)<<1)+1,((i*c+j)<<1)+2,a-'0');
		add(((i*c+j)<<1)+2,((i*c+j)<<1)+1,0);
	}
	s=n*c*2+1,t=s+1;
	int tot=0;
	for(int i=0;i<n;i++)for(int j=0;j<c;j++){
		for(int z=0;z<n;z++)for(int g=0;g<c;g++)if(i!=z||j!=g)if(d*d>=dist(i,j,z,g)){
		   	add((i*c+j)*2+2,(z*c+g)*2+1,inf);
		   	add((z*c+g)*2+1,(i*c+j)*2+2,0);
		}
		char a;
		scanf(" %c",&a);
		if(a=='L'){
			tot++;
		   add(s,(i*c+j)*2+1,1);
		   add((i*c+j)*2+1,s,0);	
		}
		if(min(min(i+1,n-i),min(c-j,j+1))<=d)add((i*c+j)*2+2,t,inf),add(t,(i*c+j)*2+2,0);
	}
	cout<<tot-dinic();
	
	
}
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号