分析:二分图中的最大匹配数=最小顶点覆盖数
数据比较大,可以用vector,双向
#include <iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define MAXN 1505
using namespace std;
int n,m; //u,v数目
int g[MAXN][MAXN];//编号是0~n-1的
int linker[MAXN];
int used[MAXN];
vector<int> x[MAXN];
int dfs(int u)
{
int v;
for(int i=0;i<x[u].size();i++)
{
v=x[u][i];
if(!used[v])
{
used[v]=1;
if(linker[v]==-1||dfs(linker[v]))
{
linker[v]=u;
return 1;
}
}
}
return 0;
}
int hungary()
{
int res=0;
int u;
memset(linker,-1,sizeof(linker));
for(u=0;u<n;u++)
{
memset(used,0,sizeof(used));
if(dfs(u)) res++;
}
return res;
}
int main()
{
int i,j,k;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
x[i].clear();
m=n;
while(m--)
{
scanf("%d:(%d)",&i,&k);
while(k--)
{
scanf("%d",&j);
x[i].push_back(j);
x[j].push_back(i);
}
}
printf("%d\n",hungary()/2);
}
return 0;
}