POJ3020 Antenna Placement

二分图匹配水题


#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 50
using 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;
}


你可能感兴趣的:(POJ3020 Antenna Placement)