hdu2063 过山车 (匈牙利算法 二分匹配)

#include <stdio.h>
#include <string.h>
#define MAXN 1002

int map[MAXN][MAXN];
int from[MAXN],used[MAXN];

int match(int x,int n)//匈牙利算法(二分匹配)
{
	int i;
	for(i=1;i<=n;++i)//被匹配的男生  
	{
		if(!used[i]&&map[x][i])
		{
			used[i]=1;
			if(from[i]==-1||match(from[i],n))
			{
				from[i]=x; //男生[i]属于女生x
				return 1;
			}
		}
	}
	return 0;
}

int main()
{
	int k,n,m,sum,i,j;
	while(scanf("%d",&k)&&k)
	{
		memset(map,0,sizeof(map));
		memset(from,-1,sizeof(from));
		sum=0;
		scanf("%d %d",&m,&n);
		while(k--)
		{
			scanf("%d %d",&i,&j);
			map[i][j]=1;
		}
		for(i=1;i<=m;++i)//女生去匹配男生  
		{
			memset(used,0,sizeof(used));
			if(match(i,n))
				++sum;
		}
		printf("%d\n",sum);
	}
	return 0;
}

你可能感兴趣的:(hdu2063 过山车 (匈牙利算法 二分匹配))