匈牙利算法求最大匹配,不过用顶点数减去最大匹配数才是最大独立集数。
/*
Hdoj: 1068 Girls and Boys
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#define MaxS 1005
using namespace std;
bool map[MaxS][MaxS];
bool checked[MaxS];
int xM[MaxS], yM[MaxS];
int n;
bool search(int i)
{
for(int j = 0; j < n; j++) {
if(!checked[j] && map[i][j]) {
checked[j] = true;
if(yM[j] == -1 || search(yM[j])) {
xM[i] = j;
yM[j] = i;
return true;
}
}
}
return false;
}
int solve()
{
int result = 0;
for(int i = 0; i < n; i++) {
if(xM[i] == -1) {
for(int j = 0; j < n; j++)
checked[j] = false;
if(search(i)) {
result++;
}
}
}
return result;
}
int main()
{
//freopen("data.in", "rb", stdin);
while(scanf("%d", &n) != EOF) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
map[i][j] = false;
}
xM[i] = -1;
yM[i] = -1;
}
for(int i = 0; i < n; i++) {
int a, b;
scanf("%d: (%d)", &a, &b);
while(b--) {
int c;
scanf("%d", &c);
map[a][c] = true;
}
}
int matches = solve();
printf("%d\n", n - matches / 2);
}
return 0;
}