简单题,纯粹用来温习一下匈牙利算法:
#include <stdio.h>
#include <string.h>
#define maxn 305
int test, p, n, m;
int g[maxn][maxn], a[maxn], b[maxn];
bool used[maxn];
void add(int x, int y)
{
g[x][y] = 1;
}
bool find(int s)
{
for (int i = 1; i <= n; i++)
{
if (g[s][i] == 1 && !used[i])
{
used[i] = true;
if (b[i] == -1 || find(b[i]))
{
a[s] = i;
b[i] = s;
return true;
}
}
}
return false;
}
int main()
{
freopen("1.txt", "r", stdin);
int i, j, k;
scanf("%d", &test);
while (test--)
{
scanf("%d%d", &p, &n);
memset(g, 0, sizeof(g));
for (i = 0; i < p; i++)
{
scanf("%d", &j);
while (j--)
{
scanf("%d", &k);
add(i + 1, k);
}
}
int ans = 0;
memset(a, -1, sizeof(a));
memset(b, -1, sizeof(b));
for (i = 1; i <= p; i++)
{
if (a[i] == -1)
{
memset(used, false, sizeof(used));
if (find(i))
{
ans++;
}
}
}
if (ans == p)
{
printf("YES/n");
}
else
{
printf("NO/n");
}
}
return 0;
}