题目大意:有n个学生,p门课程,一个学生可以选修多门课程,现在要为这p门课程分别选一个课代表,且一个学生只能当一个科目的课代表,问是否能满足所有课程都找到课代表。
运用常用模板:
#include <iostream>
using namespace std;
const int N = 310;
int map[N][N], flag[N];
int pre[N];
int n, m, num;
int find(int cur)
{
int i ;
for(i = 1; i <= m; i++)
{
if(map[cur][i] && !flag[i])
{
flag[i] = 1;
if(pre[i] == -1 || find(pre[i]))
{
pre[i] = cur;
return 1;
}
}
}
return 0;
}
int main()
{
int sum;
int t;
cin >> t;
while(t--)
{
memset(map, 0, sizeof(map));
memset(pre, -1, sizeof(pre));
sum = 0;
cin >> n >> m;
for(int i = 0; i < n; i++)
{
int cnt;
int temp;
cin >> cnt;
for(int j = 0; j < cnt; j++)
{
cin >> temp;
map[i][temp] = 1;
}
}
for(int i = 0; i < n; i++)
{
memset(flag, 0, sizeof(flag));
sum += find(i);
}
if(sum == n)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}