题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068
分析
这道题考查最大独立集,同时它符合二分图的定义,所以用匈牙利算法来做,具体关系是最大独立集 = 顶点数 - 最大匹配,注意问题中是一个集合,所以最后最大匹配数要除以2,可以弄个简单的案例,如
6
0: (1) 3
1: (1) 4
2: (1) 5
3: (1) 0
4: (1) 1
5: (1) 2
手动模拟算法运行的过程就会知道需要除以2。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1000 + 10;
int n,a[N][N],match[N],vis[N];
bool find(int i)
{
for(int j = 0; j < n; j++) {
if(!vis[j] && a[i][j]) {
vis[j] = 1;
if(match[j] == -1 || find(match[j])) {
match[j] = i;
return true;
}
}
}
return false;
}
int main()
{
while(~scanf("%d",&n)) {
int m,u,v;
memset(a,0,sizeof(a));
for(int i = 0; i < n; i++) {
scanf("%d: (%d)",&u,&m);
for(int j = 0; j < m; j++) {
scanf("%d",&v);
a[u][v] = 1;
}
}
int ans = 0;
memset(match,-1,sizeof(match));
for(int i = 0; i < n; i++) {
memset(vis,0,sizeof(vis));
if(find(i)) ans++;
}
printf("%d\n",n - ans / 2);
}
return 0;
}