1. 程式人生 > 其它 >Girls and Boys HDU - 1068

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;
}