总算A穿第一个专题。来屯思路的。
蜥蜴
没有比这个更板子的了。对于每个石柱拆点成两个,连边限制流量。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int cnt=2,in[22][22],out[22][22],n,m,d,tms[22][22],ecnt=1,dep[1005]; 4 int fir[1005],l[50005],to[50005],v[50005],x,maxflow,q[1005],t,cntt; 5 int fab(int p){return p*p;} 6 void connect(int a,int b,int vv){ 7 l[++ecnt]=fir[a];fir[a]=ecnt;to[ecnt]=b;v[ecnt]=vv; 8 l[++ecnt]=fir[b];fir[b]=ecnt;to[ecnt]=a; 9 } 10 int read1(){ 11 register int ch=getchar(); 12 while(ch<'0'||ch>'3')ch=getchar(); 13 return ch-48; 14 } 15 int read2(){ 16 register int ch=getchar(); 17 while(ch!='L'&&ch!='.')ch=getchar(); 18 return ch=='L'; 19 } 20 int bfs(){ 21 memset(dep,0,sizeof(dep)); dep[1]=q[1]=1; t=1; 22 for(int h=1;h<=t;++h) for(int i=fir[q[h]];i;i=l[i]) 23 if(!dep[to[i]]&&v[i]){ 24 dep[to[i]]=dep[q[h]]+1; 25 q[++t]=to[i]; 26 if(to[i]==2)return 1; 27 } 28 return 0; 29 } 30 int dfs(int p,int flow){ 31 if(p==2)return flow;int res=flow; 32 for(int i=fir[p];i;i=l[i]) if(dep[to[i]]==dep[p]+1&&v[i]&&res){ 33 int q=dfs(to[i],min(res,v[i])); 34 if(!q)dep[to[i]]=0; 35 res-=q;v[i]-=q;v[i^1]+=q; 36 } 37 return flow-res; 38 } 39 int main(){ 40 scanf("%d%d%d",&n,&m,&d); 41 for(int i=1;i<=n;++i) for(int j=1;j<=m;++j){ 42 tms[i][j]=read1(); 43 if(tms[i][j]) connect(cnt+1,cnt+2,tms[i][j]), 44 in[i][j]=++cnt,out[i][j]=++cnt; 45 } 46 for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) 47 if(read2()) connect(1,in[i][j],1),cntt++; 48 for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) if(tms[i][j]) 49 for(int k=1;k<=n;++k) for(int l=1;l<=m;++l) if(tms[k][l]) 50 if(i!=k||j!=l) if(fab(i-k)+fab(j-l)<=fab(d)) 51 connect(out[i][j],in[k][l],1234567); 52 for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) if(tms[i][j]) 53 if(i<=d||n-i<d||j<=d||m-j<d) connect(out[i][j],2,7654321); 54 while(bfs())maxflow+=dfs(1,1234567); 55 printf("%d",cntt-maxflow); 56 }