题解:这是一道求二分图最大独立点集的模板题,我们有如下的公式
最大独立点集=n-最大匹配数/2,为什么要除以2,因为这里的二分图是对称的,比如说1和3是匹配的,那么3和1也是匹配的,我么只需要删除1这个点就可以删除两条边,所以要除以2。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n;
const int maxn = 1500;
int scoreadam[maxn], scoreeve[maxn];
int edge[maxn][maxn], vis[maxn], link[maxn];
int dfs(int l)
{
for (int r = 0; r < n; r++)//注意这里的点编号是从0开始的
{
if (edge[l][r]==1 && !vis[r])
{
vis[r] = 1;
if (link[r] == -1 || dfs(link[r]))
{
link[r] = l;
return 1;
}
}
}
return 0;
}
int hungary()
{
int cnt = 0;
memset(link, -1, sizeof(link));
for (int i = 0; i < n; i++)//同理从0开始
{
memset(vis, 0, sizeof(vis));
if (dfs(i))cnt++;
}
return cnt;
}
int main()
{
int t,id,x,num;
while (~scanf("%d", &n))
{
memset(edge, 0, sizeof(edge));
for (int i = 1; i <= n; i++)
{
scanf("%d: (%d)", &id, &x);
for (int i = 0; i < x; i++)
{
cin >> num;
edge[id][num] = 1;
}
}
cout << n - hungary()/2 << endl;
}
}