/*
分析:
最小顶点覆盖。
纳闷儿了,开了2222的数组存边,用了1296K,WA了;
改成200W的,用了332K,ac了。。。
2012-08-03 08:15
*/
分析:
最小顶点覆盖。
纳闷儿了,开了2222的数组存边,用了1296K,WA了;
改成200W的,用了332K,ac了。。。
2012-08-03 08:15
*/
#include"stdio.h"
#include"string.h"
struct Eage
{
int from;
int to;
int next;
}eage[2222222];
int tot;
int head[1555];
int n;
int match[1555];
int visit[1555];
void add(int a,int b)
{
eage[tot].from=a;
eage[tot].to=b;
eage[tot].next=head[a];
head[a]=tot++;
}
int DFS(int k)
{
int e;
e=head[k];
while(e!=-1)
{
if(visit[eage[e].to]) {e=eage[e].next;continue;}
visit[eage[e].to]=1;
if(match[eage[e].to]==-1 || DFS(match[eage[e].to]))
{
match[eage[e].to]=k;
return 1;
}
e=eage[e].next;
}
return 0;
}
int main()
{
int n;
int i,l;
int t;
int a,b;
int ans;
char str[111];
while(scanf("%d",&n)!=-1)
{
tot=0;
memset(head,-1,sizeof(head));
for(i=0;i<n;i++)
{
scanf("%s",str);
a=0;
for(l=0;str[l]&&str[l]!=':';l++) {a*=10;a+=str[l]-'0';}
t=0;
for(l+=2;str[l]!=')';l++) {t*=10;t+=str[l]-'0';}
while(t--)
{
scanf("%d",&b);
add(a,b);
add(b,a);
}
}
memset(match,-1,sizeof(match));
ans=0;
for(i=0;i<n;i++)
{
if(head[i]==-1) continue;
memset(visit,0,sizeof(visit));
ans+=DFS(i);
}
printf("%d\n",ans/2);
}
return 0;
}