这个,直接匈牙利。
然后,记得用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; } }