裸地二分匹配
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stack>
using namespace std;
#define MAXN 300
int match[MAXN];
bool vis[MAXN], gra[MAXN][MAXN];
int p, n;
bool dfs( int x)
{
for( int i = 1; i <= n; i++)
{
if(gra[x][i] && !vis[i])
{
vis[i] = 1;
if(!match[i] || dfs(match[i]))
{
match[i] = x;
return 1;
}
}
}
return 0;
}
int solve( )
{
int ans = 0;
for( int i = 1; i <= p; i++)
{
memset(vis, 0, sizeof(vis));
if(dfs(i)) ans++;
if(ans == p) break;
}
if(ans == p)
printf("YES\n");
else
printf("NO\n");
}
int main()
{
int t;
scanf("%d",&t);
while( t--)
{
scanf("%d %d",&p, &n);
memset(match, 0, sizeof(match));
memset(vis, 0, sizeof(vis));
memset(gra, 0, sizeof(gra));
for(int i = 1; i <= p ; i++)
{
int num, tem;
scanf("%d",&num);
for(int j = 0; j < num; j++)
scanf("%d",&tem),gra[i][tem] = 1;
}
solve();
}
return 0;
}