1、求二分图最大匹配,看是否等于p。用匈牙利算法(增广路算法)。
#include<cstdio>
#include<cstring>
using namespace std;
int g[110][310],from[310],vis[310];
bool match(int x){
for(int i=1;i<=g[x][0];i++)
if(!vis[g[x][i]]){
vis[g[x][i]]=1;
if(from[g[x][i]]==-1||match(from[g[x][i]])){
from[g[x][i]]=x;
return true;
}
}
return false;
}
int main(){
int T,p,n,num;
scanf("%d",&T);
while(T--){
scanf("%d%d",&p,&n);
for(int i=1;i<=p;i++){
scanf("%d",&g[i][0]);
num=g[i][0];
for(int j=1;j<=num;j++)
scanf("%d",&g[i][j]);
}
int ans=0;
memset(from,-1,sizeof(from));
for(int i=1;i<=p;i++){
memset(vis,0,sizeof(vis));
if(match(i)) ans++;
}
if(ans==p) printf("YES\n");
else printf("NO\n");
}
return 0;
}