Girls and Boys HDU - 1068

原题链接
考察:二分图
思路:
  求最大的集合,该集合内无边相连,即最大独立集.这里比较难把点分成二部分.我们可以直接不分,将每个点看成出度和入度,每条边(不相交)都等价于2个匹配.最后将匹配数\(/2\)即可.

Code

#include <iostream> 
#include <cstring>
#include <vector>
using namespace std;
const int N = 1010;
int n,match[N];
bool st[N];
vector<int> to[N];
bool dfs(int u)
{
	for(int i=0;i<to[u].size();i++)
	{
		int v = to[u][i];
		if(st[v]) continue;
		st[v] = 1;
		if(!match[v]||dfs(match[v]))
		{
			match[v] = u;
			return 1;
		}
	}
	return 0;
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		memset(match,0,sizeof match);
		for(int i=0;i<n+5;i++) to[i].clear();
		for(int i=0;i<n;i++)
		{
			int id,sz,j;
			scanf("%d: (%d) ",&id,&sz);
			while(sz--)
			{
				scanf("%d",&j);
				to[id].push_back(j);
			}
		}
		int res = 0;
		for(int i=0;i<n;i++)
		{
			memset(st,0,sizeof st);
			if(dfs(i)) ++res;
		}
		printf("%d\n",n-res/2);
	}
	return 0;
}
posted @ 2021-07-14 17:43  acmloser  阅读(30)  评论(0编辑  收藏  举报