生物考的心态崩的不行,只能靠刷刷这种水题这样子才能生活下去。这题就是简单的把学生和课程匹配起来,最后看他的最大匹配能否等于课程数。
#include<stdio.h>
#include<stdlib.h>
int g[1000][1000]={0},link[1000]={0},b[1000]={0};
int p,n,num;
int find(int a)
{
int i,j;
for(i=1;i<=p;i++)
if(g[i][a]&&b[i]==0)
{
b[i]=1;
if(link[i]==0||find(link[i]))
{
link[i]=a;
return 1;}
}
return 0;
}
int main()
{
int i,j,k,x,y,ans=0;
scanf("%d",&num);
for(k=1;k<=num;k++)
{
memset(g,0,sizeof(g));
memset(b,0,sizeof(b));
memset(link,0,sizeof(link));
ans=0;
scanf("%d%d",&p,&n);
for(i=1;i<=p;i++)
{
scanf("%d",&x);
for(j=1;j<=x;j++)
{scanf("%d",&y);
g[i][y]=1;}//g[x][y]中x代表课程,y代表学生人数
}
for(i=1;i<=n;i++)
{
memset(b,0,sizeof(b));
if(find(i))
ans++;
}
if(ans==p)
printf("YES\n");
else printf("NO\n");
}
return 0;
}