二分图模板题
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
vector<int>e[4000];
bool vis[4000];
int link[4000];
int n;
bool find(int a)
{
for(int i = 0;i<e[a].size();i++)
{
int v = e[a][i];
if(!vis[v])
{
vis[v] = true;
if(link[v] == 0||find(link[v]))
{
link[v] = a;
return true;
}
}
}
return false;
}
int hungray()
{
int ans = 0;
memset(link,0,sizeof(link));
for(int i = 0;i<n;i++)
{
memset(vis,0,sizeof(vis));
if(find(i))++ans;
}
return ans;
}
int main()
{
int i,j,a,b,c;
while(scanf("%d",&n)!=EOF)
{
for(i = 0;i<n;i++)e[i].clear();
for(i = 1;i<=n;i++)
{
scanf("%d:(%d)",&a,&b);
for(j = 1;j<=b;j++)
{
scanf("%d",&c);
e[a].push_back(c);
e[c].push_back(a);
}
}
printf("%d\n",hungray()/2);
}
return 0;
}