题意:有 n 门选修课, m 个同同学,现在告诉你每门课的成员,要从每门课的成员中选出一个做代表,一个同学只能代表一门选修课,求最大的代表数。
题解:核心算法 -> 匈牙利算法
CODE:
/* Author: JDD PROG: rqnoj140 寻找代表元 DATE: 2015.9.28 */ #include <cstdio> #include <cstring> #define REP(i, s, n) for(int i = s; i <= n; i ++) #define REP_(i, s, n) for(int i = n; i >= s; i --) #define MAX_N 205 using namespace std; int n, m, G[MAX_N], map[MAX_N][MAX_N]; bool used[MAX_N]; void init() { scanf("%d%d", &n, &m); memset(map, 0, sizeof(map)); REP(i, 1, n){ int x; scanf("%d", &x); while(x != 0) map[i][x] = 1, scanf("%d", &x); } } bool find(int x) { REP(i, 1, m){ if(!used[i] && map[x][i]){ used[i] = 1; if(!G[i] || find(G[i])){ G[i] = x; return 1; } } } return 0; } void doit() { memset(G, 0, sizeof(G)); int ans = 0; REP(i, 1, n){ memset(used, 0, sizeof(used)); if(find(i)) ans ++; } printf("%d\n", ans); } int main() { init(); doit(); return 0; }
时间: 2024-10-14 20:12:15