二分图最大匹配。
纯模版题,一点小错WA了两次。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#define MAXN 305
using namespace std;
int N,P,link[MAXN];
bool vis[MAXN],gl[MAXN][MAXN];
bool Match(int v)
{
for(int i=1; i<=N; ++i)
if(gl[v][i]&&!vis[i])
{
vis[i]=true;
if(!link[i]||Match(link[i]))
{
link[i]=v;
return true;
}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&P,&N);
int n,v;
memset(gl,0,sizeof(gl));
for(int i=1; i<=P; ++i)
{
scanf("%d",&n);
for(int j=0; j<n; ++j)
{
scanf("%d",&v);
gl[i][v]=true;
}
}
memset(link,0,sizeof(link));
int ans=0;
for(int i=1; i<=P; ++i)
{
memset(vis,0,sizeof(vis));
if(Match(i))
ans++;
}
if(ans==P) puts("YES");
else puts("NO");
}
return 0;
}