标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7123 Accepted Submission(s): 4057
/** 刚看题,没有想到二分图匹配,然后查了题解, 题意:是在一个4*4的矩阵中放大炮,看能放大炮的最大数,(.)表示空地,(X) 表示墙, 如果大炮所在的该行或该列存在大炮,然后就不能相互攻击,否则能够相互攻击 做法:二分图最大匹配 匈牙利算法 **/ #include<iostream> #include<stdio.h> #include<algorithm> #include<cmath> #include<string.h> using namespace std; #define maxn 1100 bool g[maxn][maxn]; bool used[maxn]; int un,vn; int linker[maxn]; int mmap[maxn]; int row[maxn][maxn]; int roww = 0,coll = 0; int col[maxn][maxn]; int dfs(int u) { for(int i =0 ; i<coll; i++) { if(g[u][i] &&used[i]==false) { used[i] =true; if(linker[i] == -1 || dfs(linker[i])) { linker[i] = u; mmap[u] = i; return 1; } } } return 0; } int hungry() { int res = 0; memset(linker,-1,sizeof(linker)); memset(mmap,-1,sizeof(mmap)); for(int u = 0; u<roww; u++) { if(mmap[u] == -1) { memset(used,false,sizeof(used)); res += dfs(u); } } return res; } char ch[110][110]; int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE int n; while(~scanf("%d",&n)) { if(n == 0) break; for(int i=0; i<n; i++) { scanf("%s",ch[i]); } memset(row,-1,sizeof(row)); memset(col,-1,sizeof(col)); roww = 0; coll = 0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(ch[i][j] == ‘.‘ && row[i][j] == -1) { for(int k=j;ch[i][k] == ‘.‘ &&k<n;k++) { row[i][k] = roww; } roww++; } if(ch[j][i] == ‘.‘&& col[j][i] == -1) { for(int k = j;ch[k][i] == ‘.‘ && k<n;k++) { col[k][i] = coll; } coll++; } } } memset(g,false,sizeof(g)); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(ch[i][j]== ‘.‘) g[row[i][j]][col[i][j]] = true; } } printf("%d\n", hungry()); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenyang920/p/4392368.html