md,匹配题感觉全是二分图+匈牙利
#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<vector>
#include<set>
#include<queue>
#include<list>
#include<map>
using namespace std;
const int maxi = 310;
int mp[maxi][maxi],used[maxi],who[maxi];
int p,n;
void inti(){
memset(mp,0,sizeof(mp));
memset(used,0,sizeof(used));
memset(who,-1,sizeof(who));
}
void read(){
cin >> p >> n;
int k,stu;
for(int i=1;i<=p;i++){
cin >> k;
for(int j=0;j<k;j++){
cin >> stu;
mp[i][stu]=1;
}
}
}
int dfs(int u){
for(int i=1;i<=n;i++){
if(mp[u][i]&&!used[i]){
used[i]=1;
if(who[i]==-1||dfs(who[i])){
who[i]=u;
return 1;
}
}
}
return 0;
}
int solve(){
int all=0;
memset(who,-1,sizeof(who));
for(int i=1;i<=p;i++){
memset(used,0,sizeof(used));
if(dfs(i))all++;
}
return all;
}
int main() {
int t,mat;
cin >> t;
while(t--){
inti();
read();
mat=solve();
if(mat<p){
cout << "NO"<<endl;
}else{
cout << "YES"<<endl;
}
}
}