http://acm.hdu.edu.cn/showproblem.php?pid=1507
二分图匹配
View Code
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=110; 6 const int dx[4]={0,1,0,-1}; 7 const int dy[4]={1,0,-1,0}; 8 int mz[N][N],n,m; 9 int mat[N][N],vis[N][N]; 10 int f(int x,int y) 11 { 12 return (x-1)*m+y-1; 13 } 14 bool find(int u) 15 { 16 int x=u/m+1, y=u%m+1; 17 for(int d=0;d<4;d++) 18 { 19 int nx=x+dx[d], ny=y+dy[d]; 20 if(mz[nx][ny] || vis[nx][ny]) continue; 21 vis[nx][ny]=true; 22 if(mat[nx][ny]==-1 || find(mat[nx][ny])) 23 { 24 mat[nx][ny]=u; 25 return true; 26 } 27 } 28 return false; 29 } 30 int maxmatch() 31 { 32 int cnt=0; 33 memset(mat,-1,sizeof(mat)); 34 for(int i=1;i<=n;i++) 35 for(int j=1;j<=m;j++) if((i+j)%2 && mz[i][j]==0) 36 { 37 memset(vis,0,sizeof(vis)); 38 if(find(f(i,j))) cnt++; 39 } 40 return cnt; 41 } 42 int main() 43 { 44 while(scanf("%d%d",&n,&m),n||m) 45 { 46 memset(mz,0,sizeof(mz)); 47 int k; 48 scanf("%d",&k); 49 while(k--) 50 { 51 int x,y; 52 scanf("%d%d",&x,&y); 53 mz[x][y]=1; 54 } 55 for(int i=0;i<=m+1;i++) 56 mz[0][i]=mz[n+1][i]=1; 57 for(int i=0;i<=n+1;i++) 58 mz[i][0]=mz[i][m+1]=1; 59 int ans=maxmatch(); 60 printf("%d\n",ans); 61 for(int i=1;i<=n;i++) 62 for(int j=1;j<=m;j++) if(mat[i][j]!=-1) 63 printf("(%d,%d)--(%d,%d)\n",i,j,mat[i][j]/m+1,mat[i][j]%m+1); 64 } 65 return 0; 66 }