POJ 3020 Antenna Placement 匈牙利算法,最大流解法 难度:1
http://poj.org/problem?id=3020
1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 using namespace std; 5 char maz[62][62]; 6 int e[500][500]; 7 int d[4][2]={0,1,0,-1,1,0,-1,0}; 8 int n,m; 9 vector <int > G[500]; 10 bool vis[500]; 11 void addedge(int from,int to){ 12 e[from][to]=1; 13 G[from].push_back(to); 14 } 15 int dfs(int s){ 16 vis[s]=true; 17 if(s==n*m+1){//printf("dfs %d ok\n",s); 18 return 1;} 19 for(int i=0;i<G[s].size();i++){ 20 if(!vis[G[s][i]]&&e[s][G[s][i]]&&dfs(G[s][i])){ 21 e[s][G[s][i]]=0; 22 e[G[s][i]][s]=1; 23 // printf("dfs %d ok\n",s); 24 return 1; 25 } 26 } 27 //printf("dfs %d failed \n",s); 28 return 0; 29 } 30 int maxflow(){ 31 int ans=0,f; 32 while(1){ 33 f=dfs(n*m); 34 memset(vis,0,sizeof(vis)); 35 if(f==0)break; 36 ans+=f; 37 } 38 return ans; 39 } 40 void printe(){ 41 for(int i=0;i<m*n+2;i++){ 42 bool f=false; 43 for(int j=0;j<m*n+2;j++){ 44 if(e[i][j]){printf("e[%d][%d] ",i,j);f=true;} 45 } 46 if(f) printf("\n"); 47 } 48 } 49 int main(){ 50 int t; 51 scanf("%d",&t); 52 while((t--)&&scanf("%d%d",&n,&m)==2){ 53 for(int i=0;i<=n*n+1;i++){G[i].clear();} 54 memset(e,0,sizeof(e)); 55 56 for(int i=0;i<n;i++){ 57 scanf("%s",maz[i]); 58 } 59 int ans=0; 60 int star=0; 61 for(int i=0;i<n;i++){ 62 for(int j=0;j<m;j++){ 63 if(maz[i][j]=='*'){ 64 star++; 65 if((i+j)&1){ 66 addedge(n*m,i*m+j);//n*n s n*n+1 t 67 // printf("addedge %d %d %d %d:%d to %d\n",n,0,i,j,n*m,i*m+j); 68 for(int k=0;k<4;k++){ 69 int nx=i+d[k][0]; 70 int ny=j+d[k][1]; 71 if(nx>=0&&nx<n&&ny>=0&&ny<m&&maz[nx][ny]=='*'){ 72 addedge(i*m+j,nx*m+ny); 73 // printf("addedge %d %d %d %d:%d to %d\n",i,j,nx,ny,i*m+j,nx*m+ny); 74 } 75 } 76 } 77 else { 78 addedge(i*m+j,n*m+1); 79 //printf("addedge %d %d %d %d:%d to %d\n",i,j,n,1,i*m+j,n*m+1); 80 for(int k=0;k<4;k++){ 81 int nx=i+d[k][0]; 82 int ny=j+d[k][1]; 83 if(nx>=0&&nx<n&&ny>=0&&ny<m&&maz[nx][ny]=='*'){ 84 addedge(i*m+j,nx*m+ny); 85 e[i*m+j][nx*m+ny]=0; 86 // printf("addedge %d %d %d %d:%d to %d\n",i,j,nx,ny,i*m+j,nx*m+ny); 87 } 88 } 89 } 90 } 91 } 92 } 93 94 ans=maxflow(); 95 printf("%d\n",star-ans); 96 } 97 return 0; 98 }