题意:有n个人要去买魔杖,有m根魔杖(和哈利波特去买魔杖的时候一样,是由魔杖选人)。接下来是m行,每行第一个数k是第i根魔杖可以选的人数,接着k个数表示这根魔杖选的人的编号。最后问老板最多能卖出多少根魔杖。
二分图最大匹配模板题 匈牙利算法
链接:hdu 1179
#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 = 2555;
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;
while(~scanf("%d", &n)){
scanf("%d", &m);
memset(mat, 0, sizeof(mat));
gn = n;
gm = m;
int a, x, y;
for(int i = 1; i <= m; i++) {
scanf("%d", &a);
while(a--) {
scanf("%d", &x);
mat[x][i] = 1;
}
}
int res = maxmatch();
printf("%d\n", res);
}
return 0;
}