hdu终于100题了 嘎嘎嘎嘎嘎
题意:有n个人,一些人认识另外一些人,选取一个集合,使得集合里的每个人都互相不认识,求该集合中人的最大个数。
题解:这题就是求最大独立集,但是这并不是两个集合,而是一个集合,所以求出最大匹配后需要/2,然后代公式:最大独立集=N-最大匹配。最大匹配直接用匈牙利算法求。
代码:
#include <cstdio>
#include <cstring>
#define N 1100
int Map[N][N],M[N],vis[N],n;
bool dfs(int u){
for(int i=0;i<n;i++){
if(Map[u][i]&&!vis[i]){
vis[i]=1;
if(M[i]==-1||dfs(M[i])){
M[i]=u;
return true;
}
}
}
return false;
}
int main(){
while(scanf("%d",&n)!=EOF){
memset(Map,0,sizeof(Map));
for(int i=0;i<n;i++){
int y,m;
scanf("%d: (%d) ",&y,&m);
for(int j=0;j<m;j++){
int x;
scanf("%d",&x);
Map[y][x]=1;
}
}
memset(M,-1,sizeof(M));
int res=0;
for(int i=0;i<n;i++){
memset(vis,0,sizeof(vis));
if(dfs(i)) res++;
}
printf("%d\n",n-res/2);
}
return 0;
}