题意:有n个人,一些人认识另外一些人,选取一个集合,使得集合里的每个人都互相不认识,求该集合中人的最大个数。
题解:这题就是求最大独立集,但是这并不是两个集合,而是一个集合,所以求出最大匹配后需要/2,然后代公式: |最大独立集| = |V|-|最大匹配数|
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1005
int n,m;
int mp[MAXN][MAXN];
int link[MAXN],vis[MAXN];
int match(int x){
for(int i=0;i<n;i++){
if(mp[x][i]&&!vis[i]){
vis[i]=1;
if(link[i]==-1||match(link[i])){
link[i]=x;
return 1;
}
}
}
return 0;
}
int hungary(){
int tot=0;
memset(link,-1,sizeof(link));
for(int i=0;i<n;i++){//要从课程开始匹配
memset(vis,0,sizeof(vis));
if(match(i))
tot++;
}
return tot;
}
int main(){
// freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
memset(mp,0,sizeof(mp));
for(int i=1;i<=n;i++){
int a,t;
scanf("%d: (%d)",&a,&t);
while(t--){
int b;
scanf("%d",&b);
mp[a][b]=1;
}
}
printf("%d\n",n-hungary()/2);
}
return 0;
}