最大二分匹配,注意不要把m,n弄反
# include <stdio.h>
# include <string.h>
int ma[301][301];
bool flag[301];
int mark[301];
int t;
int n, m;
int hungary(int x)
{
for (int i = 1; i <= m; i ++){
if (ma[x][i] && !flag[i]){
flag[i] = true;
if (hungary(mark[i]) || !mark[i]){
mark[i] = x;
return 1;
}
}
}
return 0;
}
int main()
{
int t;
scanf("%d", &t);
while (t --){
memset(ma, 0, sizeof(ma));
memset(mark, 0, sizeof(mark));
scanf("%d%d", &n , &m);
for (int i = 1; i <= n; i ++){
int k;
scanf("%d", &k);
for (int ii = 1; ii <= k; ii ++){
int x;
scanf("%d", &x);
ma[i][x] = 1;
}
}
int counter = 0;
for (int i = 1; i <= n; i ++){
memset(flag, false, sizeof(flag));
if (hungary(i))counter ++;
}
if (counter == n){
printf("YES/n");
}
else
printf("NO/n");
}
return 0;
}