题意:有p个课程,n个学生,每一个课程选一个课代表,每个学生可报名几个课程(但只能担任一个),问能否给每个课程选一个课代表。
求一个最大匹配看是否等于课程数。
链接:hdu - 1083
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1000;
const int maxm = 1000;
int used[maxn];
int link[maxn];
int mat[maxn][maxn];
int gn, gm;
int dfs(int t) {
for(int i = 1; i <= gm; i++) {
if(!used[i] && mat[t][i]) {
used[i] = 1;
if(link[i] == -1 || dfs(link[i])) {
link[i] = t;
return 1;
}
}
}
return 0;
}
int maxmatch() {
int num = 0;
memset(link, 0xff, sizeof(link));
for(int i = 1; i <= gn; i++) {
memset(used, 0, sizeof(used));
if(dfs(i)) {
num++;
}
}
return num;
}
int main()
{
int n, m, k, t;
cin >> t;
while(t--) {
scanf("%d %d", &m, &n);
gn = m;
gm = n;
memset(mat, 0, sizeof(mat));
for(int i = 1; i <= m; i++) {
int k;
cin >> k;
while(k--) {
int j;
cin >> j;
mat[i][j] = 1;
}
}
int res = maxmatch();
if(res == m) {
puts("YES");
}
else {
puts("NO");
}
}
return 0;
}