标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1155 Accepted Submission(s): 485
/** 题意:给出一个矩阵,然后求矩阵中有多少个‘##’(上下左右)都行 做法:二分图最大匹配,匈牙利算法,时间复杂度是O(VE), **/ #include<iostream> #include<cmath> #include<string.h> #include<algorithm> #include<stdio.h> #define maxn 670 using namespace std; char ch[maxn][maxn]; int mmap[maxn][maxn]; int g[maxn][maxn]; int linker[maxn]; int used[maxn]; int num = 0; int n; int dfs(int u) { for(int v = 0;v<num;v++) { if(g[u][v] && used[v] == 0) { used[v] = 1; if(linker[v] == -1 || dfs(linker[v])) { linker[v] = u; return 1; } } } return 0; } int hungary() { memset(linker,-1,sizeof(linker)); int res = 0; for(int i=0;i<num;i++) { memset(used,0,sizeof(used)); if(dfs(i)) res++; } return res; } int main() { //#ifndef ONLINE_JUDGE // freopen("in.txt","r",stdin); //#endif // ONLINE_JUDGE int T; scanf("%d",&T); int Case = 1; while(T--) { scanf("%d",&n); num = 0; for(int i=0;i<n;i++) { scanf("%s",ch[i]); } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(ch[i][j] == ‘#‘) mmap[i][j] = num++; } } memset(g,0,sizeof(g)); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(ch[i][j] == ‘#‘) { if(i<n-1 && ch[i+1][j] == ‘#‘) { g[mmap[i][j]][mmap[i+1][j]] = 1; g[mmap[i+1][j]][mmap[i][j]] = 1; } if(j<n-1 && ch[i][j+1] == ‘#‘) { g[mmap[i][j]][mmap[i][j+1]] = 1; g[mmap[i][j+1]][mmap[i][j]] = 1; } } } } int re = hungary(); printf("Case %d: %d\n",Case++,re/2); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenyang920/p/4392708.html