标签:
Description
Input
Output
Sample Input 4 .X.. .... XX.. .... 2 XX .X 3 .X. X.X .X. 3 ... .XX .XX 4 .... .... .... .... 0 Sample Output 5 1 5 2 4
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045
********************************************
题意:n乘n 的矩阵,一般同一行同一列不能放两个‘O‘,如果有‘X‘分割开来则可以,问你在‘.‘处最多可以放多少个‘O‘。
分析:二分匹配。
AC代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<queue> 5 #include<algorithm> 6 #include<time.h> 7 #include<stack> 8 #include<vector> 9 using namespace std; 10 #define N 1200 11 #define INF 0x3f3f3f3f 12 13 int vv[N],x,y,n; 14 char maps[10][10]; 15 int vis[N][N],v[N]; 16 17 struct node 18 { 19 int x,y; 20 } a[N][N]; 21 22 int Hungary(int u)///匈牙利算法匹配 23 { 24 for(int i=1; i<=y; i++) 25 if(vis[u][i]&&!v[i]) 26 { 27 v[i]=1; 28 if(!vv[i]||Hungary(vv[i])) 29 { 30 vv[i]=u; 31 return 1; 32 } 33 } 34 35 return 0; 36 } 37 38 int main() 39 { 40 int i,j; 41 42 while(scanf("%d", &n),n) 43 { 44 for(i=0; i<n; i++) 45 scanf("%s", maps[i]); 46 47 x=0,y=0; 48 memset(vis,0,sizeof(vis)); 49 50 for(i=0; i<n; i++) 51 for(j=0; j<n; j++) 52 { 53 ///把图分割,以相连的‘.’为行和列重新分配编号 54 if(maps[i][j]==‘.‘) 55 { 56 if(j==0||maps[i][j-1]==‘X‘) 57 x++; 58 a[i][j].x=x; 59 } 60 if(maps[j][i]==‘.‘) 61 { 62 if(j==0||maps[j-1][i]==‘X‘) 63 y++; 64 a[j][i].y=y; 65 } 66 } 67 68 for(i=0; i<n; i++) 69 for(j=0; j<n; j++) 70 if(maps[i][j]==‘.‘) 71 { 72 int u=a[i][j].x; 73 int v=a[i][j].y; 74 vis[u][v]=1;///用行匹配列 75 } 76 77 int ans=0; 78 memset(vv,0,sizeof(vv)); 79 for(i=1; i<=x; i++) 80 { 81 memset(v,0,sizeof(v)); 82 if(Hungary(i)==1) 83 ans++; 84 } 85 86 printf("%d\n", ans); 87 } 88 return 0; 89 }
标签:
原文地址:http://www.cnblogs.com/weiyuan/p/5799363.html