Girls and Boys HDU - 1068

#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N =1e5;
int n;
int h[N], e[N], ne[N], idx;
int match[N];
bool st[N];
void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
bool find(int x) {
	for (int i = h[x]; i != -1; i = ne[i]) {//枚举所有看上的
		int j = e[i];
		if (!st[j]) {//如果没考虑过
			st[j] = true;//表示考虑过了
			//如果这个妹子还没匹配其他男生 ,或者说虽然已经匹配了,但可以给那个男生找到下家
			if (match[j] == -1 || find(match[j])) {
				match[j] = x;
				return true;
			}
		}
	}
	return false;
}
int main() {
	while(scanf("%d",&n)!=EOF&&(n)) {
		idx=0;
		memset(h, -1, sizeof h);
		memset(match,-1,sizeof(match));
		for(int i=0;i<n;i++)
		{
			int x,num;
			scanf("%d: (%d)",&x,&num);
			while(num--)
			{
				int y;
				scanf("%d",&y);
				add(x,y);
				add(y,x);
			}
		}
		int res = 0;//匹配的数量
		for (int i = 0; i < n; i ++ ) {//依次看每个男生
			memset(st, false, sizeof st);//先把所以的妹子清空,表示都还没考虑过
			if (find(i)) 
				res ++ ;//如果成功过找到,就加一
		}
		printf("%d\n", n-res/2);
	}
	return 0;
}
posted @ 2020-03-01 00:06  晴屿  阅读(119)  评论(0)    收藏  举报