二分图的最大匹配
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<vector> using namespace std; const int MAXN=1505; int linker[MAXN]; bool used[MAXN]; vector<int>map[MAXN]; int uN; char m[MAXN][MAXN]; int tt[MAXN][MAXN]; bool dfs(int u) { for(int i=0;i<map[u].size();i++) { if(!used[map[u][i]]) { used[map[u][i]]=true; if(linker[map[u][i]]==-1||dfs(linker[map[u][i]])) { linker[map[u][i]]=u; return true; } } } return false; } int hungary() { int u; int res=0; memset(linker,-1,sizeof(linker)); for(u=0;u<uN;u++) { memset(used,false,sizeof(used)); if(dfs(u)) res++; } return res; } int main() { int T; int u,k,v; int n; scanf("%d",&T); for(int yy=1;yy<=T;yy++) { scanf("%d",&n); uN=0; memset(tt,-1,sizeof tt); for(int i=0;i<MAXN;i++) map[i].clear(); for(int i=0;i<n;i++)scanf("%s",m[i]); for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(m[i][j]=='#') tt[i][j]=uN,uN++; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(tt[i][j]!=-1) { if(j+1<n&&tt[i][j+1]!=-1) { map[tt[i][j]].push_back(tt[i][j+1]); map[tt[i][j+1]].push_back(tt[i][j]); } if(i+1<n&&tt[i+1][j]!=-1) { map[tt[i][j]].push_back(tt[i+1][j]); map[tt[i+1][j]].push_back(tt[i][j]); } } printf("Case %d: ",yy); printf("%d ",hungary()/2); } return 0; }