hdu 4185(最大匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4185
思路:坐标映射建双向图,只要满足条件构成矩阵,就连边,最后求一下最大匹配即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 #define MAXN 360036 8 vector<int>vet[MAXN]; 9 char map[666][666]; 10 bool mark[MAXN]; 11 int n; 12 int ly[MAXN]; 13 14 int dfs(int u){ 15 for(int i=0;i<vet[u].size();i++){ 16 int v=vet[u][i]; 17 if(!mark[v]){ 18 mark[v]=true; 19 if(ly[v]==-1||dfs(ly[v])){ 20 ly[v]=u; 21 return 1; 22 } 23 } 24 } 25 return 0; 26 } 27 28 int MaxMatch(){ 29 int res=0; 30 memset(ly,-1,sizeof(ly)); 31 for(int i=1;i<=n*n;i++){ 32 memset(mark,false,sizeof(mark)); 33 res+=dfs(i); 34 } 35 return res; 36 } 37 38 int main(){ 39 // freopen("1.txt","r",stdin); 40 int _case,t=1; 41 scanf("%d",&_case); 42 while(_case--){ 43 scanf("%d",&n); 44 for(int i=1;i<=n*n;i++)vet[i].clear(); 45 for(int i=1;i<=n;i++) 46 scanf("%s",map[i]+1); 47 for(int i=1;i<=n;i++){ 48 for(int j=1;j<=n;j++){ 49 if(map[i][j]=='.')continue; 50 if(i+1<=n&&map[i+1][j]=='#'){ 51 vet[(i-1)*n+j].push_back(i*n+j); 52 vet[i*n+j].push_back((i-1)*n+j); 53 } 54 if(j+1<=n&&map[i][j+1]=='#'){ 55 vet[(i-1)*n+j].push_back((i-1)*n+j+1); 56 vet[(i-1)*n+j+1].push_back((i-1)*n+j);\ 57 } 58 } 59 } 60 int ans=MaxMatch(); 61 printf("Case %d: %d\n",t++,ans/2); 62 } 63 return 0; 64 }