题意:
有n个人要配对,每个人都有几个喜欢的对象。
问最多能选出几个人,使得选出的人无法配对。
思路:
每个人向所有喜欢的对象分别连一条边,
最大独立数=总人数-最大匹配数。
把一个人看作两个,即二分图左边的与右边的,总人数为2n,最后结果也要除以2。
代码(780K,1579MS):
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int n;
vector<int> edges[505];
int mat[505];
bool vis[505];
bool dfs(int k) {
for (int i = 0; i < edges[k].size(); i++) {
int j = edges[k][i];
if (!vis[j]) {
vis[j] = 1;
if (!mat[j] || dfs(mat[j])) {
mat[j] = k;
return true;
}
}
}
return false;
}
int match() {
int ans = 0;
for (int i = 0; i < n; i++) {
memset(vis, 0, sizeof(vis));
if (dfs(i)) ans++;
}
return ans;
}
int main() {
while (~scanf("%d", &n)) {
int a, b, k;
char ch;
for (int i = 0; i < n; i++)
edges[i].clear();
for (int i = 0; i < n; i++) {
cin >> a >> ch >> ch >> k >> ch;
for (int i = 0; i < k; i++) {
scanf("%d", &b);
edges[a].push_back(b);
}
}
memset(mat, 0, sizeof(mat));
int ans = n - match() / 2;
printf("%d\n", ans);
}
return 0;
}