http://acm.hdu.edu.cn/showproblem.php?pid=1068
二分图最大独立集,说白了还是二分最大匹配的应用
二分最大匹配:虽然说是二分图,但是在应用中常常是一个集合中的元素相互关联,
将这个集合克隆成两份。用匈牙利(Hungary)算法求出一个结果Res。
最大匹配=Res/2
二分图最大独立集=集合中的元素-最大匹配
推荐一个更优化的代码:http://blog.csdn.net/niushuai666/article/details/7072997
#include <iostream>
#include <cstring>
#include <map>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#define INF 10000000
#define MAXN 505
using namespace std;
int lin[MAXN],N;
bool mp[MAXN][MAXN],used[MAXN];
bool find(int a){
for(int i=0;i<N;i++){
if(mp[a][i]&&!used[i]){
used[i]=1;
if(lin[i]==-1||find(lin[i])){
lin[i]=a;
return true;
}
}
}//for_i
return false;
}
int hungary(){
int sum=0;
for(int i=0;i<N;i++) {
memset(used,0,sizeof(used));
if(find(i)) sum++;
}//for
return sum;
}
int main(){
int a,b,m;
while(scanf("%d",&N)!=EOF){
memset(mp,0,sizeof(mp));
memset(lin,-1,sizeof(lin));
for(int i=0;i<N;i++){
scanf("%d: (%d)",&a,&m);
for(int j=0;j<m;j++){
scanf("%d",&b);
mp[a][b]=1;
}//for_j
}//for_i
int temp=hungary();
printf("%d\n",N-temp/2);
}
return 0;
}