HDU 1068 Girls And Boys 二分图题解

Posted liguangsunls

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1068 Girls And Boys 二分图题解相关的知识,希望对你有一定的参考价值。

选择出一组学生,这组学生里面不能彼此之间有过恋爱史的。

又是一个典型的二分图问题。

只是须要把全部学生看成一组*2,然后求最大匹配,然后除以2. 这样事实上建图的时候,建成有向图也是能够的了。

并且也是给出了两个方向的点了。

注意本题没有给出最大数是多少学生了。所以最好使用动态分配内存了。

并且本题的输入处理也特别点,要处理好。用好scanf这个函数。


#include <stdio.h>
#include <stdlib.h>

bool **stus, *used;
int *linker;
int N;

void initGraph()
{
	stus = (bool **) malloc(N * sizeof(bool *));
	for (int i = 1; i < N; i++)
		stus[i] = (bool *) calloc(N, sizeof(bool));
}
void freeGraph()
{
	for (int i = 1; i < N; i++)
		free(stus[i]);
	free(stus);
}

bool hunDFS(int u)
{
	for (int v = 1; v < N; v++)
	{
		if (!used[v] && stus[u][v])
		{
			used[v] = true;
			if (!linker[v] || hunDFS(linker[v]))
			{
				linker[v] = u;
				return true;
			}
		}
	}
	return false;
}

int hungary()
{
	int ans = 0;
	linker = (int *) calloc(N, sizeof(int));
	for (int i = 1; i < N; i++)
	{
		used = (bool *) calloc(N, sizeof(bool));
		if (hunDFS(i)) ans++;
		free(used);
	}
	free(linker);
	return ans>>1;
}

int main()
{
	int k, v;
	while (scanf("%d", &N) != EOF)
	{
		N++;
		initGraph();
		for (int u = 1; u < N; u++)
		{
			scanf("%d: (%d)", &v, &k);
			for (int i = 0; i < k; i++)
			{
				scanf("%d", &v);
				stus[u][v+1] = stus[v+1][u] = true;
			}
		}
		printf("%d\n", N - 1 - hungary());
		freeGraph();
	}
	return 0;
}





以上是关于HDU 1068 Girls And Boys 二分图题解的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1068 Girls and Boys (最大独立集)

hdu 1068 Girls and Boys 二分图的最大匹配

HDU_1068_Girls and Boys_二分图匹配

二分图匹配入门专题1B - Girls and Boys hdu1068最大独立集

hdu 1068 Girls and Boys 最大独立点集 二分匹配

HDU 1068 Girls And Boys 二分图题解