最大独立集 = 节点 - 最大匹配
#include <stdio.h>
#include <string.h>
const int MAXN = 5010;//点
const int MAXM = 50010;//边
struct Edge
{
int to, next;
} edge[MAXM];
int head[MAXN], tot;
void init()
{
tot = 0;
memset(head, -1, sizeof(head));
}
void addedge(int u, int v)
{
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
int linker[MAXN];
int un;//左边匹配点数
bool used[MAXN];
bool dfs(int u)
{
for(int i = head[u]; i != -1; i = edge[i].next)
{
//printf("-1\n");
int v = edge[i].to;
if(!used[v])
{
used[v] = true;
if(linker[v] == -1 || dfs(linker[v]))
{
linker[v] = u;
return true;
}
}
}
return false;
}
int hungary()
{
int res = 0;
memset(linker, -1, sizeof(linker));
for(int u = 0; u < un; u++)
{
memset(used, false, sizeof(used));
if(dfs(u))
res++;
}
return res;
}
int main()
{
int i;
while(scanf("%d", &un) != EOF)
{
init();
for(int i = 0; i < un; i++)
{
int k;
// printf("", i);
scanf("%d: (%d)",&i, &k);
for(int j = 0; j < k; j++)
{
int x;
scanf("%d", &x);
addedge(i, x);
}
}
int ans = un - hungary() / 2;
printf("%d\n", ans);
}
}
/*
7
3 4 5 6
2 4 6
0
0
2 0 1
1 0
2 0 1
*/