#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAXN = 305; int uN, vN; bool g[MAXN][MAXN]; int xM[MAXN], yM[MAXN]; bool chk[MAXN]; bool searchPath(int u) { for(int v = 0; v < vN; v++) if(g[u][v] && !chk[v]) { chk[v] = true; if(yM[v] == -1 || searchPath(yM[v])) { yM[v] = u; xM[u] = v; return true; } } return false; } int maxMatch() { int u, ret = 0; memset(xM, -1, sizeof(xM)); memset(yM, -1, sizeof(yM)); for(u = 0; u < uN; u++) if(xM[u] == -1) { memset(chk, false, sizeof(chk)); if(searchPath(u))ret++; } return ret; } int main() { int icase; scanf("%d", &icase); while(icase--) { //矩阵一定要初始化 memset(g, 0, sizeof(g)); int p, n; scanf("%d%d", &p, &n); uN = p; vN = n; int cnt, j; for(int i = 0; i < p; i++) { scanf("%d", &cnt); while(cnt--) { scanf("%d", &j); //转换为下标从0开始 j--; g[i][j] = true; } } //每一个课程都只有一个代表 if(maxMatch() == p)puts("YES"); else puts("NO"); } system("pause"); return 0; }