POJ3020 Antenna Placement

来源:互联网 发布:双管德林杰分解数据图 编辑:程序博客网 时间:2024/05/21 10:04

二分图匹配水题


#ifdef _MSC_VER#define DEBUG#define _CRT_SECURE_NO_DEPRECATE#endif#include <fstream>#include <stdio.h>#include <iostream>#include <string.h>#include <string>#include <limits.h>#include <algorithm>#include <math.h>#include <numeric>#include <functional>#include <ctype.h>#define MAX 50using namespace std;char pic[MAX][MAX];int diff[]={-1,0,1,0,0,-1,0,1};bool interest[MAX*MAX],map[MAX*MAX][MAX*MAX],used[MAX*MAX];int mat[MAX*MAX];bool find(const int &x,const int &n){for(int i=0;i<n;++i){if(map[x][i] && !used[i] && interest[i]){used[i]=true;if(mat[i]==-1 || find(mat[i],n)){mat[i]=x;return true;}}}return false;}int main(void){#ifdef DEBUG    freopen("../stdin.txt","r",stdin);  freopen("../stdout.txt","w",stdout); #endif  int h,w,ncases;scanf("%d",&ncases);while(ncases--){scanf("%d%d",&h,&w);memset(pic,'o',sizeof(pic));memset(map,0,sizeof(map));memset(mat,-1,sizeof(mat));memset(interest,false,sizeof(interest));getchar();for(int i=1;i<=h;++i)gets(pic[i]+1);int cnt=0;for(int i=1;i<=h;++i)for(int j=1;j<=w;++j)if(pic[i][j]=='*'){++cnt;interest[(i-1)*w+j-1]=true;for(int k=0;k<8;k+=2){int a=i+diff[k];int b=j+diff[k+1];if(pic[a][b]=='*')map[(i-1)*w+j-1][(a-1)*w+b-1] = map[(a-1)*w+b-1][(i-1)*w+j-1]=1;}}int n=h*w;int ans=0;for(int i=0;i<n;++i){memset(used,false,sizeof(used));if(interest[i])if(find(i,n))++ans;}printf("%d\n",cnt-ans+ans/2);}  return 0;}


原创粉丝点击