Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

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 }

 

posted on 2012-05-19 21:46  Qiuqiqiu  阅读(239)  评论(0编辑  收藏  举报