题目大意:有n个学生,有些学生可以配对(当然是一男一女),有些不可以,相当于如果一男一女可以配对就让他们成为一组,配对不成功的就自己一组,要求最小的组数。
所以 就是一个最大独立数的问题了
最大独立数 = 顶点数 - 最大匹配数/2
采用邻接表
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
bool v[505]; //是否已经访问
int link[505],n;
vector <int> my[505];
int find(int x)//二分匹配程序
{
int i,y;
for (i=0;i<my[x].size();i++)
{
y=my[x][i];
if (!v[y])
{
v[y]=1;
if (!link[y] || find(link[y]))
{
link[y]=x;
return 1;
}
}
}
return 0;
}
int main ()
{
int i,p,k,m,sum;
while (scanf("%d",&n)!=EOF)
{
for (i=0;i<n;i++)
my[i].clear();
for (i=0;i<n;i++)
{
scanf("%d: (%d)",&m,&k);
while (k--)
{
scanf("%d",&p);
my[m].push_back(p);
}
}
sum=0;
memset(link,0,sizeof(link));
for (i=0;i<n;i++)
{
memset(v,0,sizeof(v));
if (find(i)) sum++;
}
printf ("%d\n",n-sum/2);
}
return 0;
}