计算二分图最大匹配,套用标准模板即可。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 210;
bool vis[MAXN], mp[MAXN][MAXN]; //结点访问数组,各结点之间有无连接
int link[MAXN]; //结点匹配数组
int n, m;
//查找从x出发的增广路径
bool find(int x)
{
for (int i = n + 1; i <= n + m; i++) //遍历x的邻接点
{
if (mp[x][i] && !vis[i]) //x和i之间有对应且i未被访问
{
vis[i] = true;
//i未匹配或者从i的匹配点出发能找到增广路径
if (link[i] == -1 || find(link[i]))
{
link[i] = x;
return true;
}
}
}
return false;
}
int main()
{
while (cin >> n >> m)
{
memset(link, -1, sizeof(link));
memset(mp, false, sizeof(mp));
for (int i = 1; i <= m; i++)
{
int a, b;
cin >> a;
while (a--)
{
cin >> b;
mp[i][m + b] = true;
}
}
int ans = 0;
for (int i = 1; i <= m; i++)
{
memset(vis, false, sizeof(vis));
if (find(i))
++ans;
}
cout << ans << endl;
}
return 0;
}
继续加油。