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();


}

posted @ 2014-03-19 19:37  wangyucheng  阅读(283)  评论(0编辑  收藏  举报