BOJ 1298 Hungary算法

//Result:1298	Accepted	3MS	308K	G++	 1669B	2012-06-13 23:39:57	Wizmann

#include <cstdio>

#include <cstring>

#include <cstdlib>

#include <iostream>

#include <algorithm>

#include <bitset>

#include <stack>

#include <queue>

#include <vector>



using namespace std;



#define print(x) cout<<x<<endl

#define input(x) cin>>x

#define N 10

#define SIZE 100



const int mx[]={1,0,-1,0};

const int my[]={0,1,0,-1};



vector<int> g[SIZE];

char maze[N][N];

int r,c;

bitset<SIZE> visit;

int match[SIZE];



inline int nr(int x,int y)

{

	return c*y+x;

}



void makeG()

{

	for(int i=0;i<SIZE;i++) g[i].clear();

	for(int i=0;i<r;i++)

	{

		for(int j=0;j<c;j++)

		{

			if(maze[i][j]=='*')

			{

				for(int k=0;k<4;k++)

				{

					int ny=i+my[k];

					int nx=j+mx[k];

					if(ny>=0 && ny<r && nx>=0 && nx<c && maze[ny][nx]=='*')

					{

						g[nr(j,i)].push_back(nr(nx,ny));

					}

				}

			}

		}

	}

}



bool dfs(int now)

{

	for(int i=0;i<(int)g[now].size();i++)

	{

		int next=g[now][i];

		if(!visit[next])

		{

			visit[next]=1;

			if(match[next]==-1 || dfs(match[next]))

			{

				match[next]=now;

				return true;

			}

		}

	}

	return false;

}



int hungary()

{

	int res=0;

	memset(match,-1,sizeof(match));

	for(int i=0;i<r*c;i++)

	{

		visit.reset();

		if(dfs(i)) res++;

	}

	return res;

}



int main()

{

	freopen("input.txt","r",stdin);

	int cas=1;

	while(input(r>>c))

	{

		printf("Case %d:\n",cas++);

		int block=0;

		for(int i=0;i<r;i++)

		{

			scanf("%s",maze[i]);

			for(int j=0;maze[i][j];j++)

			{

				if(maze[i][j]=='*') block++;

			}

		}

		if(block&1) print("no");

		else

		{

			makeG();

			int sum=hungary();

			if(sum==block) print("yes");

			else print("no");

		}

	}

	return 0;

}

  

你可能感兴趣的:(算法)