题意:有n个人要去买魔杖,有m根魔杖(和哈利波特去买魔杖的时候一样,是由魔杖选人)。接下来是m行,每行第一个数k是第i根魔杖可以选的人数,接着k个数表示这根魔杖选的人的编号。最后问老板最多能卖出多少根魔杖。
二分图最大匹配模板题 匈牙利算法
链接:hdu 1179
#include #include #include #include #include #include #include #include #include #include #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; }