题目大意:给出一些课程 , 和选这些课程的学生 , 要求每个课程选一个代表 , 问能不能使所有课程的代表都是不同的学生。
这是一个基本的二分匹配的问题,但注意,输入输出时一定要用scanf、printf等标准输入输出,不要用输入输出流,不然会超时。
割掉
#include
#include
using namespace std;
const int MAX = 520 ;
int grap[MAX][MAX] , link[MAX] , useif[MAX] ;
int n , m;
int can(int t)
{
int i;
for(i = 1 ; i <= m ; i++)
{
if(grap[t][i] && !useif[i])
{
useif[i] = 1;
if(link[i] == -1 || can(link[i]))
{
link[i] = t;
return 1;
}
}
}
return 0;
}
int main()
{
int p;
scanf("%d" , &p);
while(p--)
{
scanf("%d %d" , &n , &m);
if(m < n) {printf("NO\n");continue;}
int i , x , y , j;
memset(grap , 0 , sizeof(grap));
for(i = 1 ; i <= n ; i++)
{
scanf("%d" , &x );
for(j = 1 ; j<= x ; j++)
{
scanf("%d" , &y);
grap[i][y] = 1;
}
}
memset(link , -1 , sizeof(link));
int sum = 0;
for(i = 1 ; i <= n ; i++)
{
memset(useif , 0 , sizeof(useif));
if(can(i))
sum += 1;
else break;
}
if(sum == n) printf("YES\n");
else printf("NO\n");
}
return 0;
}