题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068
题目大意:有人要研究学生间的浪漫关系,为了研究方便,必须参加研究的学生任意两人之间都没有浪漫关系,目前情况是有一些学生之间已经有了浪漫关系,从中选择符合条件的学生,问最多可以找到多少满足上述条件的学生。
解题思路:匈牙利算法。本题要求任意两人都没有关系的人数,也就是最大独立集,而二分图的最大独立集=节点数-最大匹配数。并且给出的数据不分男女,因此把得到的数据除以2才是真正的最大匹配数。
AC代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAX 1005
bool used[MAX];
int linked[MAX];
int g[MAX][MAX];
int n;
bool dfs(int u)
{
int v;
for(v=0;v<n;v++)
{
if(g[u][v]&&!used[v])
{
used[v] = true;
if(linked[v]==-1||dfs(linked[v]))
{
linked[v] = u;
return true;
}
}
}
return false;
}
int hungry()
{
int u;
int result=0;
memset(linked,-1,sizeof(linked));
for(u=0;u<n;u++)
{
memset(used,0,sizeof(used));
if(dfs(u))result++;
}
return result;
}
int main()
{
int u,v;
int num;
while(cin>>n)
{
memset(g,0,sizeof(g));
for(int i=0;i<n;i++)
{
scanf("%d: (%d)",&u,&num);
for(int j=0;j<num;j++)
{
cin>>v;
g[i][v] = 1;
}
}
cout<<n-hungry()/2<<endl;
}
return 0;
}