二分图匹配
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath> 5 #define maxn 60 6 #define maxd 1500 7 using namespace std; 8 int v[maxd][maxd],vist[maxd],math[maxd]; 9 10 int col[maxn][maxn],row[maxn][maxn]; 11 int k1,k2,n,m; 12 char str[maxn][maxn]; 13 void creat_row() 14 { 15 k1=1; 16 for(int i=0;i<m;i++) 17 { 18 int flag=0; 19 for(int j=0;j<n;j++) 20 { 21 if(str[i][j]=='*') 22 { 23 row[i][j]=k1; 24 flag=1; 25 } 26 if(str[i][j]=='#') 27 { 28 k1++; 29 flag=0; 30 } 31 } 32 if(flag) 33 k1++; 34 } 35 } 36 void creat_col() 37 { 38 k2=1; 39 for(int j=0;j<n;j++) 40 { 41 int flag=0; 42 for(int i=0;i<m;i++) 43 { 44 if(str[i][j]=='*') 45 { 46 col[i][j]=k2; 47 flag=1; 48 } 49 if(str[i][j]=='#') 50 { 51 k2++; 52 flag=0; 53 } 54 } 55 if(flag) 56 k2++; 57 } 58 } 59 int dfs(int x) 60 { 61 for(int i=1;i<k2;i++) 62 { 63 if(!vist[i]&&v[x][i]) 64 { 65 vist[i]=1; 66 if(math[i]==-1||dfs(math[i])) 67 { 68 math[i]=x; 69 return true; 70 } 71 72 } 73 } 74 return false; 75 } 76 void KM() 77 { 78 int ans=0; 79 for(int i=1;i<k1;i++) 80 { 81 memset(vist,0,sizeof(vist)); 82 if(dfs(i)) ans++; 83 } 84 printf("%d ",ans); 85 } 86 int main() 87 { 88 int t; 89 scanf("%d",&t); 90 while(t--) 91 { 92 scanf("%d %d",&m,&n); 93 for(int i=0; i<m; i++) 94 scanf("%s",&str[i]); 95 creat_row(); 96 creat_col(); 97 //printf("%d %d== ",k1,k2); 98 memset(v,0,sizeof(v)); 99 memset(math,-1,sizeof(math)); 100 for(int i=0; i<m; i++) 101 { 102 for(int j=0; j<n; j++) 103 { 104 if(str[i][j]=='*') 105 v[row[i][j]][col[i][j]]=1; 106 } 107 108 } 109 KM(); 110 } 111 return 0; 112 }