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 }