#include <iostream>
using namespace std;
int Map[ 305 ][ 305 ];
int link[ 305 ];
int visit[ 305 ];
int P, N;
void init()
{
for(int i = 0; i < P; i ++)
{
for(int j = 0; j < N; j ++)
{
Map[ i ][ j ] = 0;
}
link[ i ] = -1;
}
}
int fun(int x)
{
for(int i = 0; i < P; i ++)
{
if(Map[ i ][ x ] == 1 && visit[ i ] == 0)
{
visit[ i ] = 1;
if(link[ i ] == -1 || fun(link[ i ]))
{
link[ i ] = x;
return true;
}
}
}
return false;
}
int main()
{
int k, n, x;
scanf("%d", &k);
while(k > 0)
{
scanf("%d %d", &P, &N);
init();
for(int i = 0; i < P; i ++)
{
scanf("%d", &n);
for(int j = 0; j < n; j ++)
{
scanf("%d", &x);
Map[ i ][ x - 1 ] = 1;
}
}
int ans = 0;
for(int i = 0; i < N; i ++)
{
for(int j = 0; j < P; j ++)
{
visit[ j ] = 0;
}
if(fun(i)) ans ++;
}
if(ans == P)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
k --;
}
return 0;
}
杭电ACM1083(二分图匹配)
最新推荐文章于 2020-12-14 01:45:20 发布