RQNOJ192 梦幻大PK
题意:有n个人,每个不能和 m[i] 个PK,并知道是哪 m[i] 个,求最大PK数。
题解:核心算法 -> 匈牙利算法
CODE:
/* Author: JDD PROG: rqnoj192 梦幻大PK 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 1005 using namespace std; int n, map[MAX_N][MAX_N], G[MAX_N]; bool used[MAX_N]; inline void init() { REP(i, 1, MAX_N) REP(j, 1, MAX_N){ if(i != j) map[i][j] = 1; else map[i][j] = 0; } scanf("%d", &n); REP(i, 1, n){ int m; scanf("%d", &m); REP(j, 1, m){ int x; scanf("%d", &x); map[i][x] = 0; } } } bool find(int x) { REP(i, 1, n){ if(!used[i] && map[x][i]){ used[i] = 1; if(G[i] || find(G[i])){ G[i] = x; return 1; } } } return 0; } inline void doit() { 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; }