1066: [SCOI2007]蜥蜴

来源:互联网 发布:gta5捏脸数据清纯美女 编辑:程序博客网 时间:2024/04/28 18:47
#include<iostream>#include<cstring>#include<cstdio>#define inf 0x7fffffffusing 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;}

0 0
原创粉丝点击