poj 3020

题意:给定一个m*n的矩阵  包括*与O  现在需要用矩形把*覆盖住 问 至少需要多少个矩形 每个矩形可以覆盖两个*

思路:匈牙利算法

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int map[444][444];
 5 int fa[444];
 6 int s[444];
 7 int sum;
 8 int v[55][55];
 9 int dir[4][2]={-1,0,1,0,0,-1,0,1};
10 bool dfs(int u)
11 {
12     int i;
13     for(i=1;i<=sum;i++)
14         if(map[u][i]&&!s[i])
15         {
16             s[i]=1;
17             if(!fa[i]||dfs(fa[i]))
18             {
19                 fa[i]=u;
20                 return true;
21             }
22         }
23     return false;
24 }
25 int main()
26 {
27     int t,m,n,i,j,xx,yy;
28     char c;
29     scanf("%d",&t);
30     while(t--)
31     {
32         sum=0;
33         scanf("%d%d",&m,&n);
34         memset(map,0,sizeof(map));
35         memset(fa,0,sizeof(fa));
36         for(i=0;i<m;i++)
37             for(j=0;j<n;j++)
38             {
39                 cin>>c;
40                 if(c=='*')
41                 {
42                     sum++;
43                     v[i][j]=sum;
44                 }
45                 else v[i][j]=0;
46             }
47             for(i=0;i<m;i++)
48                 for(j=0;j<n;j++)
49                     if(v[i][j]>0)
50                     {
51                         for(int k=0;k<4;k++)
52                         {
53                             xx=i+dir[k][0];yy=j+dir[k][1];
54                             if(xx<0||xx>=m||yy<0||yy>=n)
55                                 continue;
56                             if(v[xx][yy]>0)
57                             {
58                                 map[v[xx][yy]][v[i][j]]=1;
59                                 map[v[i][j]][v[xx][yy]]=1;
60                             }
61                         }
62                     }
63             int nsum=0;
64             for(i=1;i<=sum;i++)
65             {
66                 memset(s,0,sizeof(s));
67                 if(dfs(i))
68                     nsum++;
69             }
70             cout<<sum-nsum+nsum/2<<endl;
71     }
72     return 0;
73 }

 

posted @ 2014-06-10 19:40  _一千零一夜  阅读(151)  评论(0编辑  收藏  举报