题意:n个人,每个人有一个爱慕的集合,现在要挑出一些人,使得集合中没有人两两爱慕,问这个集合最大人数是多少
思路:每个人拆成两点,爱慕和被爱慕,建图,求出二分图最大匹配,因为是两两匹配,然后人数n - 最大匹配数 / 2就是最大独立集
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int MAXN = 510; int linker[MAXN]; bool used[MAXN]; vector<int> g[MAXN]; int n; bool dfs(int u) { for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (!used[v]) { used[v] = true; if (linker[v] == -1 || dfs(linker[v])) { linker[v] = u; return true; } } } return false; } int hungary() { int res = 0; memset(linker, -1, sizeof(linker)); for (int u = 0; u < n; u++) { memset(used, false, sizeof(used)); if (dfs(u)) res++; } return res; } int main() { while (scanf("%d", &n) != EOF) { for (int i = 0; i < n; i++) g[i].clear(); int u, cnt, v; for (int i = 0; i < n; i++) { scanf("%d: (%d)", &u, &cnt); while (cnt--) { scanf("%d", &v); g[u].push_back(v); } } printf("%d\n", n - hungary() / 2); } return 0; }
时间: 2024-11-11 21:39:53