#include<iostream>
#include<vector>
using namespace std;
vector<int> edge[350];
bool used[350];
int con[350];
bool find(int x)
{
for (int i = 0; i < edge[x].size(); i++)
{
if (!used[edge[x][i]])
{
used[edge[x][i]] = true;
if (con[edge[x][i]] == -1 || find(con[edge[x][i]]))
{
con[edge[x][i]] = x;
return true;
}
}
}
return false;
}
int match(int n)
{
int res = 0;
memset(con, -1, sizeof(con));
for (int i = 0; i < n; i++)
{
memset(used, false, sizeof(used));
if (find(i))
res++;
}
return res;
}
int main()
{
int t;
cin >> t;
for (int k = 0; k < t; k++)
{
int p, n;
cin >> p >> n;
for (int i = 0; i < n; i++)
edge[i].clear();
for (int i = 0; i < p; i++)
{
int sum;
cin >> sum;
for (int j = 0; j < sum; j++)
{
int a;
cin >> a;
edge[a-1].push_back(i);
}
}
if (match(n) == p)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
hdoj1083_Courses(二分图最大匹配)
最新推荐文章于 2018-03-29 23:40:11 发布