题意很简单,
有 n 个人, 一部分是男孩,一部分是女孩,他们都有自己想要匹配的目标,问 有几个人是没有办法配对的
很容易 算出最大匹配,然后 n - 最大匹配就可以了。。就是求最大独立集合
但是这题需要注意 没说具体哪个是男哪个是女,所以我们要把一个人拆成两种人去看。。也就是说存在两种情况,最终最大匹配数要除以 2.
话不多说了。版子题,稍微改动。。用的是匈牙利算法
以下就是 AC 代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1005;
int link[maxn];
int ed[maxn][maxn];
int vis[maxn];
int n,u,v,s;
int dfs(int u)
{
for(int i = 0; i < n; i++)
{
if(ed[u][i] && !vis[i])
{
vis[i] = 1;
if(link[i] == -1 || dfs(link[i]))
{
link[i] = u;
return 1;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n))
{
memset(link,-1,sizeof(link));
memset(ed,0,sizeof(ed));
for(int i=0;i<n;i++)
{
scanf("%d: (%d)",&u,&s);
while(s--)
{
scanf("%d",&v);
ed[u][v] = 1;
}
}
int sum = 0;
for(int i=0; i<n; i++)
{
memset(vis,false,sizeof(vis));
if(dfs(i))
sum++;
}
printf("%d\n",n - sum / 2);
}
return 0;
}