原题:http://poj.org/problem?id=1469
#include<stdio.h>
#include<memory.h>
int a[101][301];
int m,n;
int pair[301];
int used[301];
bool find(int x)
{
for(int i=1;i<=n;i++) //扫描每一个学生
{
if(a[x][i]==1 && used[i]==0)
{
used[i]=1;
if(pair[i]==0 || find(pair[i])==true)
{
pair[i]=x;
return true;
}
}
}
return false;
}
int main()
{
//题目大意:有m个课程和n个学生,不同的学生选修了不同的课程,现在需要你判断能不能将其中的某部分学生组成一个委员会,
//这个委员会的作用如下:
//1.对于给的m个课程,每一个课程 分别 需要有一个学生做课代表
//2.每个学生,只能做一门课的课代表
//综上,就是要判断m个课程能否有m个学生与之一对一匹配
//思路:用匈牙利算法找最大匹配,并且最大匹配数要==课程数
int t;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(pair,0,sizeof(pair));
scanf("%d %d",&m,&n); //m 为课程数,n为学生数
int num;
for(int i=1;i<=m;i++)
{
scanf("%d",&num);
for(int j=0;j<num;j++)
{
int ei;
scanf("%d",&ei);
a[i][ei]=1;
}
}
int ans=0;
for(int i=1;i<=m;i++)
{
memset(used,0,sizeof(used));
if(find(i)){
ans++;
}
}
if(ans==m){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}