这道题是让求最大独立集,最大独立集=节点数-最大匹配数;建好图后套用模板就行了;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 1100
int n;
int used[N],mat[N][N],link[N];
int dfs(int t)
{
int i;
for(i=0; i<n; i++)
{
if(used[i]==0&&mat[t][i])
{
used[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=t;
return 1;
}
}
}
return 0;
}
int main()
{
int i,k,a;
while(scanf("%d",&n)!=EOF)
{
memset(link,-1,sizeof(link));
memset(mat,0,sizeof(mat));
int t=n;
while(t--)
{
scanf("%d: (%d)",&i,&k);
while(k--)
{
scanf("%d",&a);
mat[i][a]=1;
}
}
int num=0;
for(i=0; i<n; i++)
{
memset(used,0,sizeof(used));
if(dfs(i))
num++;
}
printf("%d\n",n-num/2);//注意num要除以2,因为是在同一个集合中匹配的
}
return 0;
}