POJ-1466 Girls and Boys 二分图+拆点构图
题意:有许多男女同学,他们之间互相喜欢,现要求出一个最大的独立子集出来。
解法:由于题目中说明了这种喜欢关系只存在于男女之间,因此可以大胆的拆点构图,因为男的喜欢的必定是女的,而女的之间不可能存在边(喜欢关系)。最大独立子集=顶点数-最大匹配数。由于是拆点构图,需要对最后的结果除以2。
代码如下:
#include <cstdlib> #include <cstring> #include <cstdio> #include <iostream> #include <algorithm> using namespace std; int N, match[505]; char G[505][505], vis[505]; bool path(int u) { for (int i = 0; i < N; ++i) { if (!G[u][i] || vis[i]) continue; vis[i] = 1; if (!(~match[i]) || path(match[i])) { match[i] = u; return true; } } return false; } int query() { // 编号从0开始,初始化为-1 int ret = 0; memset(match, 0xff, sizeof (match)); for (int i = 0; i < N; ++i) { memset(vis, 0, sizeof (vis)); ret += path(i); } return N - (ret >> 1); } int main() { int id, num, c; while (scanf("%d", &N) != EOF) { memset(G, 0, sizeof (G)); for (int i = 0; i < N; ++i) { scanf("%d: (%d)", &id, &num); for (int j = 0; j < num; ++j) { scanf("%d", &c); G[id][c] = 1; // 相当于进行了拆点构图 } } printf("%d\n", query()); } return 0; }