这题虽然很水,但是因为是我HDU的第200题,所以庆祝一下,写个博客~~。这题的题意是,给你一个关系,代表哪堂课有哪些学生去上课,每门要选课代表,一个学生只能代表一门课,问你,能不能每门课都有课代表。这是一道典型的二分匹配问题,求个最大匹配就好了。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#define maxn 400
#define inf 100000005
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
int n, p, lk[maxn + 5];
bool vis[maxn + 5], maps[maxn + 5][maxn + 5];
bool dfs(int a)
{
for(int i = p + 1;i <= p + n;i++)
{
if(!vis[i]&&maps[a][i])
{
vis[i] = 1;
if(lk[i] == -1||dfs(lk[i]))
{
lk[i] = a;
return true;
}
}
}
return false;
}
int main()
{
int cas, a, b;
scanf("%d", &cas);
while(cas--)
{
mem(lk, -1);
mem(maps, 0);
scanf("%d%d", &p, &n);
for(int i = 1;i <= p;i++)
{
scanf("%d", &a);
for(int j = 0;j < a;j++)
{
scanf("%d", &b);
maps[i][b + p] = 1;
}
}
int ans = 0;
for(int i = 1;i <= p;i++)
{
mem(vis, 0);
if(dfs(i))
ans++;
}
if(ans != p)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}