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-ans/2);
		zero(match); zero(mp);
	}
    return 0;
}
原文地址:https://www.cnblogs.com/shuitiangong/p/13532144.html