这个,直接匈牙利。
然后,记得用scanf()。
cin超时,亲测有效。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int line[101][301];
int x[301],vis[301];
int n,m,a,b,k,ans;
bool find(int z)
{
for(int i=1;i<=m;++i)
if(line[z][i]&&!vis[i])
{
vis[i]=1;
if(!x[i]||find(x[i]))
{
x[i]=z;
return 1;
}
}
return 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(line,0,sizeof(line));
memset(x,0,sizeof(x));
ans=0;
scanf("%d%d",&n,&m);
int flag=0;
for(int i=1;i<=n;++i)
{
scanf("%d",&k);
for(int j=0;j<k;++j)
{
scanf("%d",&a);
line[i][a]=1;
}
if(k==0)
flag=1;
}
if(flag)
{
cout<<"NO"<<endl;
continue;
}
for(int i=1;i<=n;++i)
{
memset(vis,0,sizeof(vis));
if(find(i))
ans++;
}
if(ans==n)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}