总算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 }
View Code

相关文章: