就是求最小定点覆盖数
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define me(a) memset(a,-1,sizeof(a))
struct node
{
int u,next;
}e[1505];
int top,head[1505],f[1505],book[1505];
vector<int>g[1505];
void add(int u,int v)
{
e[top].u=v;
e[top].next=head[u];
head[u]=top++;
}
int dfs(int x)
{
for(int i=0;i<g[x].size();i++)
{
int u=g[x][i];
if(book[u]==-1)
{
book[u]=1;
if(f[u]==-1||dfs(f[u]))
{
f[u]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int n;
while(~scanf("%d",&n))
{me(head);top=0; me(f);
for(int i=0;i<n;i++)
{
int a,b,c;
scanf("%d:(%d)",&a,&b);
for(int j=0;j<b;j++)
{
scanf("%d",&c);
g[a].push_back(c);
g[c].push_back(a);
}
}
int ans=0;
for(int i=0;i<n;i++)
{
me(book);
if(dfs(i))ans++;
}
printf("%d\n",ans/2);
for(int i=0;i<=n;i++)
g[i].clear();
}
}