HDU 1179 Ollivanders: Makers of Fine Wands since 382 BC.(最大匹配)

题目地址:点击打开链接

思路:简单二分图匹配,代码粘的详解的,所以解释有点扯淡,对应关系是,为每个魔法棒找巫师,对应为每个光棍找妹子,注意光棍要从1开始循环,不能从0开始循环,不然会出错,导致的结果妹子的丈夫为0时,有时会再给她一个丈夫

AC代码:

#include<stdio.h>
#include<string.h>

int lol[110][110],visit[110],cf[110],n;

bool find(int l)
{
	int i;
	for(i=1; i<=n; i++)
	{
		if(lol[l][i] && !visit[i])//有好感并且没尝试把妹子许配给别人,要是visit[i]等于1表明,前面有一个人要i这个妹子要定了
		{
			visit[i] = 1;//表明i这个妹子l要定了,别人不能再娶了,不然下面一条语句腾妹子的过程,本来想让i这个妹子的丈夫重娶一个妹子,结果这个妹子的丈夫还是娶了她,然后又把这个妹子配给l,这就太扯淡了,所以这一句不能放在if语句里面
			if(!cf[i] || find(cf[i]))//i这个妹子没丈夫或者能让她的丈夫重娶一个妹子,和这个妹子离婚
			{
				cf[i] = l;//妹子i的丈夫就是l了
				return true;//光棍l摆脱单身
			}
		}
	}
	return false;
}

int main()
{
	int m,k,l,i,j,sum;
	while(scanf("%d%d",&n,&m) != EOF)
	{
		sum = 0;
		memset(lol,0,sizeof(lol));
		memset(cf,0,sizeof(cf));
		for(i=1; i<=m; i++)//i从1开始就过了,从0开始就过不了,为啥?有可能妹子i的丈夫是0,会误认为没有,所以从1开始赋值
		{
			scanf("%d",&k);
			for(j=0; j<k; j++)
			{
				scanf("%d",&l);
				lol[i][l] = 1;
			}
		}
		for(i=1; i<=m; i++)
		{
			memset(visit,0,sizeof(visit));
			if(find(i))//为每个光棍找妹子
				sum++;
		}
		printf("%d\n",sum);
	}
	return 0;
}


你可能感兴趣的:(HDU 1179 Ollivanders: Makers of Fine Wands since 382 BC.(最大匹配))