# include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int n,cot; int map[660],vis[660],pp[660][660],u[660][660]; int bfs(int x) { for(int i=1;i<=cot;i++) { if(!vis[i]&&pp[x][i]) { vis[i]=1; if(!map[i]||bfs(map[i])) { map[i]=x; return 1; } } } return 0; } void judge(int x,int y) { if(x<n-1&&u[x+1][y]) pp[u[x][y]][u[x+1][y]]=pp[u[x+1][y]][u[x][y]]=1;//相连的“#”标记 if(y<n-1&&u[x][y+1]) pp[u[x][y]][u[x][y+1]]=pp[u[x][y+1]][u[x][y]]=1; } int main() { int t,cas,i,j; char a[660][660]; while(~scanf("%d",&t)) { cas=0; while(t--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%s",a[i]); memset(u,0,sizeof(u)); cot=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(a[i][j]=='#') u[i][j]=++cot;//为“#”标记 } } memset(pp,0,sizeof(pp)); for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(u[i][j]) { judge(i,j); } } } int res=0; memset(map,0,sizeof(map)); for(i=1;i<=cot;i++)//一共1到cot个油田 { memset(vis,0,sizeof(vis)); if(bfs(i)) res++; } printf("Case %d: %d\n",++cas,res/2); } } return 0; }
hdu4185 Oil Skimming(二分匹配),布布扣,bubuko.com
原文:http://blog.csdn.net/lp_opai/article/details/38417675