hdu 5093 Battle ships

二分图匹配

  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 }
原文地址:https://www.cnblogs.com/tsw123/p/4478010.html