poj 1469 COURSES
给定一些学生和一些课程,在给定这些课程有哪些学生能上,判断出是否能选出一些学生保证每个课程都有人上
解法:二分图匹配的匈牙利算法, 先把学生和课程关系用一个矩阵存下来,然后查找学生和课程可以连接的,把连上的课程标记出是哪个学生连接上的,然后继续查找,如果满足可以连接,可是课程已经被其他学生占用了,就查找那个占用的学生是否还可以连接到其他课程,知道结束。。
#include <stdio.h>
#include <string.h>
int t;
int n, m;
int course;
int student;
int map[105][305];
int vis[305];
int zg[305];
int judge;
int i, j;
int xi(int n)
{
int i;
for (i = 1; i <= m; i ++)
{
if (map[n][i] && vis[i] == 0)
{
vis[i] = 1;
if (zg[i] == -1 || xi(zg[i]))
{
zg[i] = n;
return 1;
}
}
}
return 0;
}
int main()
{
scanf("%d", &t);
while (t --)
{
int num = 0;
judge = 0;
memset(map, 0, sizeof(map));
memset(vis, 0, sizeof(vis));
memset(zg, 0, sizeof(zg));
int i;
scanf("%d%d", &n, &m);
for (i = 0; i <= m; i ++)
zg[i] = -1;
for (i = 1; i <= n; i ++)
{
scanf("%d", &course);
if (course == 0)
judge = 1;
while (course --)
{
scanf("%d", &student);
map[i][student] = 1;
}
}
if (judge)
printf("NO\n");
else
{
for (i = 1; i <= n; i ++)
{
memset(vis, 0, sizeof(vis));
if (xi(i))
num ++;
}
if (num == n)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}