现在的位置: 首页 > 综合 > 正文

1066: [SCOI2007]蜥蜴

2018年04月24日 ⁄ 综合 ⁄ 共 1932字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstring>
#include<cstdio>
#define inf 0x7fffffff
using namespace std;
inline int read(){  
    int x=0,f=1;char ch=getchar();  
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}  
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}  
    return x*f;  
}
struct edge{
	int to,next,v;
}e[50001];
int r,c,d,cnt=1,ans,T=801,mp[21][21],mark[21][21],head[50001],h[50001];
bool judge(int x1,int y1,int x2,int y2){
    if(((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))<=(d*d)&&mp[x1][y1]&&mp[x2][y2])return 1;
    return 0;
}
void insert(int u,int v,int w){
	e[++cnt]=(edge){v,head[u],w};head[u]=cnt;
	e[++cnt]=(edge){u,head[v],0};head[v]=cnt;
}
inline bool bfs(){
	int q[50001],t=0,w=0;
	memset(h,-1,sizeof(h));
	h[0]=0;
	while(t<=w){
		int now=q[t++];
		for(int i=head[now];i;i=e[i].next){
			if(e[i].v&&h[e[i].to]==-1){
				h[e[i].to]=h[now]+1;
				q[++w]=e[i].to;
			}
		}
	}
	if(h[T]==-1)return 0;
	else return 1;
}
inline int dfs(int x,int f){
	if(x==T)return f;
	int rest,used=0;
	for(int i=head[x];i;i=e[i].next){
		if(e[i].v&&h[e[i].to]==h[x]+1){
			rest=f-used;
			rest=dfs(e[i].to,min(e[i].v,rest));
			e[i].v-=rest;
			e[i^1].v+=rest;
			used+=rest;
			if(used==f)return f;
		}
	}
	if(!used)h[x]=-1;
	return used;
}
void dinic(){
	while(bfs())ans-=dfs(0,inf);
}
int main(){
	r=read();c=read();d=read();
    char ch[21];
    for(int i=1;i<=r;i++){
    	scanf("%s",ch);
    	for(int j=1;j<=c;j++)
        	mp[i][j]=ch[j-1]-'0';
    }
    int tot=0;
    for(int i=1;i<=r;i++)
    	for(int j=1;j<=c;j++)
			mark[i][j]=++tot; 
	for(int i=1;i<=r;i++){
    	scanf("%s",ch);
    	for(int j=1;j<=c;j++)
        	if(ch[j-1]=='L'){
        		insert(0,mark[i][j],1);
				ans++;
			}
        }
    for(int i=1;i<=d;i++)
    	for(int j=d+1;j<=r-d;j++){
        	insert(mark[j][i]+400,801,inf);
        	insert(mark[j][c-i+1]+400,801,inf);
        }
    for(int i=1;i<=d;i++)
    	for(int j=1;j<=c;j++){
        	insert(mark[i][j]+400,801,inf);
        	insert(mark[r-i+1][j]+400,801,inf);
        }
	for(int x1=1;x1<=r;x1++)
    	for(int y1=1;y1<=c;y1++)
        	for(int x2=x1-d;x2<=x1+d;x2++)
            	for(int y2=y1-d;y2<=y1+d;y2++)
    if(judge(x1,y1,x2,y2)&&(x1!=x2||y1!=y2))
	 	insert(mark[x1][y1]+400,mark[x2][y2],inf); 
	for(int i=1;i<=r;i++)
    	for(int j=1;j<=c;j++)
        	if(mp[i][j])insert(mark[i][j],mark[i][j]+400,mp[i][j]);
	dinic();
	printf("%d",ans);
	return 0;
}

抱歉!评论已关闭.