题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1083
#include <stdio.h>
#include <stdlib.h>
#define bool char
#define true 1
#define false 0
#include <string.h>
int link[105][305];
int vis[305];
int stu[305];
int n,p;
bool find(int num) {
int i;
for(i=1; i<=n; i++) {
if(link[num][i]&&!vis[i]) {
vis[i]=1;
if(stu[i]==0||find(stu[i])) {
stu[i]=num;
return true;
}
}
}
return false;
}
int main() {
int all;
int t,i,m,a;
scanf("%d",&t);
while(t--) {
memset(link,0,sizeof(link));
memset(stu,0,sizeof(stu));
all=0;
scanf("%d%d",&p,&n);
for(i=1; i<=p; i++) {
scanf("%d",&m);//m是参观的学生个数
while(m--) {
scanf("%d",&a);
link[i][a]=1;//i是课程编号,a是学生编号
}
}
for(i=1; i<=p; i++) {
memset(vis,0,sizeof(vis));
if(find(i)) {
all+=1;
}
}
if(all==p) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}