杭电ACM2063(二分图匹配)

#include 
using namespace std;

#define MAXN 500
int match[ MAXN ][ MAXN ];
int visit[ MAXN ];
int link[ MAXN ];
int K, M, N, A, B;

void init()
{
	for(int i = 0; i < N; i ++)
	{
		for(int j = 0; j < M; j ++)
		{
			match[ j ][ i ] = 0;
		}
		link[ i ] = -1;
	}
}

bool find(int x)
{
	for(int i = 0; i < N; i ++)
	{
		if(match[ x ][ i ] == 1 && visit[ i ] == 0)
		{
			visit[ i ] = 1;
			if(link[ i ] == -1 || find(link[ i ]))
			{
				link[ i ] = x;
				return true;
			}
		}
	}	
	return false;
}

int main()
{
	while(scanf("%d", &K))
	{
		if(K == 0)
		{
			break;
		}
		scanf("%d %d", &M, &N);
		init();
		while(K > 0)
		{
			scanf("%d %d", &A, &B);
			match[ A - 1 ][ B - 1 ] = 1;
			K --;	
		}
		
		int ans = 0;
		for(int i = 0; i < M; i ++)
		{
			for(int j = 0; j < N; j ++)
			{
				visit[ j ] = 0;
			}
			if(find(i))
			{
				ans ++;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

你可能感兴趣的:(杭电ACM2063(二分图匹配))