题意:有n个同学之间有暧昧关系,求最多的一组同学,其之间任意两人没有暧昧关系。
由于是在n个同学内部匹配,我们把每个同学拆成两份,求出的最大匹配除以二即可。
由定理:最大独立集=定点数-最大匹配,可以求解。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 1100
using namespace std;
int mp[N][N],v[N],linker[N],n;
int dfs(int t)
{
for(int i=0;i<n;i++)
{
if(!v[i]&&mp[t][i])
{
v[i]=1;
if(linker[i]==-1||dfs(linker[i]))
{
linker[i]=t;
return 1;
}
}
}
return 0;
}
int hungary()
{
int ans=0;
memset(linker,-1,sizeof(linker));
for(int i=0;i<n;i++)
{
memset(v,0,sizeof(v));
if(dfs(i)) ans++;
}
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
memset(mp,0,sizeof(mp));
for(int i=0;i<n;i++)
{
int u,v,t;
scanf("%d: (%d)",&u,&t);
for(int j=0;j<t;j++)
{
scanf("%d",&v);
mp[u][v]=1;
}
}
int ans=hungary()/2;
cout<<n-ans<<endl;
}
}