标签:
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<iostream> 5 using namespace std; 6 const int inf=100000000,N=110; 7 int fx[4]={0,0,1,-1},fy[4]={1,-1,0,0}; 8 struct ee{int to,next,f;}e[500001]; 9 int head[N*N],q[N*2*N],dis[N*N],a[N][N]; 10 int S,T,n,m,cnt=1,ans,w; 11 12 void ins(int u,int v,int f){ 13 e[++cnt].to=v;e[cnt].f=f;e[cnt].next=head[u];head[u]=cnt; 14 e[++cnt].to=u;e[cnt].f=0;e[cnt].next=head[v];head[v]=cnt; 15 } 16 17 bool bfs(){ 18 for (int i=1;i<=T;i++) dis[i]=inf; 19 int h=0,t=1,now; 20 q[1]=S;dis[S]=0; 21 while(h!=t){ 22 now=q[++h]; 23 for (int i=head[now];i;i=e[i].next){ 24 int v=e[i].to; 25 if (e[i].f&&dis[now]+1<dis[v]){ 26 dis[v]=dis[now]+1; 27 if (v==T)return 1; 28 q[++t]=v; 29 } 30 } 31 } 32 if (dis[T]==inf) return 0; return 1; 33 } 34 35 int dinic(int now,int f){ 36 if (now==T) return f; 37 int rest=f; 38 for (int i=head[now];i;i=e[i].next){ 39 int v=e[i].to; 40 if (e[i].f&&dis[v]==dis[now]+1&&rest){ 41 int t=dinic(v,min(rest,e[i].f)); 42 if (!t) dis[v]=0; 43 e[i].f-=t; 44 e[i^1].f+=t; 45 rest-=t; 46 //if(t) printf("%d %d %d\n",now,v,e[i].f); 47 } 48 } 49 return f-rest; 50 } 51 int main(){ 52 scanf("%d%d",&n,&m); 53 S=0,T=n*m+1; 54 for(int i=1;i<=n;i++) 55 for(int j=1;j<=m;j++) 56 scanf("%d",&a[i][j]); 57 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) 58 if(a[i][j]==1) ins(S,(i-1)*m+j,inf); 59 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) 60 if(a[i][j]==2) ins((i-1)*m+j,T,inf); 61 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ 62 if(a[i][j]==1) { 63 for(int ii=0;ii<4;ii++) { 64 int nx=i+fx[ii],ny=j+fy[ii]; 65 if(nx>n||nx<1||ny>m||ny<1||a[nx][ny]==1) continue; 66 ins((i-1)*m+j,(nx-1)*m+ny,1); 67 } 68 } 69 else if(a[i][j]==0){ 70 for(int ii=0;ii<4;ii++) { 71 int nx=i+fx[ii],ny=j+fy[ii]; 72 if(nx>n||nx<1||ny>m||ny<1||a[nx][ny]==1) continue; 73 ins((i-1)*m+j,(nx-1)*m+ny,1); 74 } 75 } 76 } 77 while(bfs()) 78 ans+=dinic(S,inf); 79 printf("%d",ans); 80 }
标签:
原文地址:http://www.cnblogs.com/wuminyan/p/5211718.html