【杭电oj】过山车(二分图最大匹配,匈牙利算法)

过山车

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 16644    Accepted Submission(s): 7265


Problem Description
RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?
 

Input
输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
 

Output
对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。
 

Sample Input
   
   
   
   
6 3 3 1 1 1 2 1 3 2 1 2 3 3 1 0
 

Sample Output
   
   
   
   
3
 

Author
PrincessSnow
 

Source
RPG专场练习赛  


感受了一下新算法,感觉还可以,还能接受 = =

这道题算是这个算法最基础的题吧,看起来还需要加油啊!

代码如下:

#include <cstdio>
#include <cstring>
int fr[505][505];		//是否愿意一组
int used[505];
int F[505];		//某男生与女生的匹配情况 
int k,m,n;		//组合数,女生数,男生数 
bool find(int x)
{
	for (int i = 1 ; i <= n ; i++)
	{
		if (fr[x][i] && !used[i])		//此女生愿意和男生一起且男生没有在之前查找过
		{
			used[i] = 1;		//查找完后标记一下
			if (F[i])		//若不为0则匹配过女生 
			{
				if (find(F[i]))		//查看其匹配的女生是否还可以与其他男生匹配(从而让出这个男生)
				{
					F[i] = x;
					return true;
				}
			}
			else		//该男生没有匹配,那么就和该女生匹配吧 
			{
				F[i] = x;
				return true;
			}
		}
	}
	return false;
}
int main()
{
	int ans;
	while (~scanf ("%d",&k) && k)
	{
		scanf ("%d %d",&m,&n);
		memset (fr,0,sizeof (fr));
		memset (F,0,sizeof (F));
		ans = 0;
		while (k--)
		{
			int x,y;
			scanf ("%d %d",&x,&y);
			fr[x][y] = 1;
		}
		for (int i = 1 ; i <= m ; i++)
		{
			memset (used,0,sizeof (used));
			if (find(i))
				ans++;
		}
		printf ("%d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(【杭电oj】过山车(二分图最大匹配,匈牙利算法))