原题
题意
题目挺长,balabalabala说了一大堆,其实就是有p门课程,每门课程可能有不止一名学生选。一名学生只能代表一门课程,问是否每个课程都能有一个学生代表。
思路
嘛,就是二分图匹配一下,看最大匹配数是否等于课程数即可。
#include<stdio.h>
#include<string.h>
#define mem(x) memset(x,0,sizeof(x))
#define N 310
int dis[N][N],book[N];
int b[N],t,p,n;
bool found(int x)
{
for(int i=1;i<=n;i++){
if(dis[x][i]&&!book[i]){
book[i]=1;
if(b[i]==0||found(b[i])){
b[i]=x;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d",&t);
while(t--){
int k,x;
mem(dis),mem(b);
scanf("%d%d",&p,&n);
for(int i=1;i<=p;i++){
scanf("%d",&k);
for(int j=1;j<=k;j++){
scanf("%d",&x);
dis[i][x]=1;
}
}
int ans=0;
for(int i=1;i<=p;i++){
mem(book);
if(found(i)) ans++;
}
if(ans==p)
printf("YES\n");
else printf("NO\n");
}
return 0;
}