题意:P门课程,N个学生,每个学生可以选任意门课,但每门课程须要一个代表,且每个学生只能成为一门课的代表。
给出 第i门课 有哪些学生选, 问 能否达到要求;
思路: 单纯的求 最大匹配 是不是等于P。
#include <iostream>
using namespace std;
const int P=110,N=310;
int p,n;
int link[N];
bool map[P][N],used[N];
bool DFS(int x)
{
for(int i=1; i<=n; i++)
{
if(!used[i] && map[x][i])
{
used[i] = true;
if(!link[i] || DFS(link[i]))
{
link[i] = x;
return true;
}
}
}
return false;
}
int main()
{
int t,i,count,stu,num;
scanf("%d", &t);
while(t--)
{
memset(map, false, sizeof(map));
memset(link, 0, sizeof(link));
scanf("%d %d", &p, &n);
for(i=1; i<=p; i++)
{
scanf("%d", &count);
while(count--)
{
scanf("%d", &stu);
map[i][stu] = true;
}
}
for(i=1,num=0; i<=p; i++)
{
memset(used, false, sizeof(used));
if(DFS(i)) num++;
}
if(num==p) printf("YES\n");
else printf("NO\n");
}
return 0;
}