POJ 1466 Girls and Boys(最大独立集)
解题思路
题目要求互相没有关系的最大集合,那么等于说t除最少的点,使剩下的点没有相互关系,也等于用最少的点覆盖所有关系,问题就转化成了求最小点覆盖问题了。
代码
const int maxn = 5e2+10;
const int maxm = 1e3+10;
int n, vis[maxn], match[maxn], mp[maxn][maxn];
int find(int x) {
for (int i = 1; i<=n; ++i)
if (!vis[i] && mp[x][i]) {
vis[i] = 1;
if (!match[i] || find(match[i])) {
match[i] = x;
return 1;
}
}
return 0;
}
int main() {
while(~scanf("%d", &n)) {
for (int i = 1, num, t, num2; i<=n; ++i) {
scanf("%d: (%d)", &num, &t);
while(t--) {
scanf("%d", &num2);
mp[num+1][num2+1] = 1;
}
}
int ans = 0;
for (int i = 1; i<=n; ++i) {
if (find(i)) ++ans;
zero(vis);
}
printf("%d\n", n-ans/2);
zero(match); zero(mp);
}
return 0;
}