poj 1466 Girls and Boys 二分图-最大独立子集
题意
N个人,其中包含男女,然后某些男女之间有关系。现要求找出最大的K人,其之间两两无关系。
解题思路
最大独立子集问题。
题意是求最大独立集,但是N太大(其实也不大,就是数据好强,KB算法T了), 因为男女生有边,男男或者女女之间不会有边,所以理论上将男女分开,然后就形成二分图了.
但是,男女情况不明....我是将N个看成一个集合,与其自身匹配. 拆点将N个人看成 集合A{N},与集合B{N},然后求最大匹配, 结果即为最大独立集 : N - 最大匹配/2
#include<stdio.h> #include<stdlib.h> #include<string.h> const int N = 510; bool a[N][N], vis[N]; int n, ma[N],mb[N]; int path( int u ){ for(int v = 0; v < n; v++){ if( a[u][v] && !vis[v] ){ vis[v] = 1; if( ma[v] == -1 || path( ma[v] ) ){ ma[v] = u; mb[u] = v; return 1; } } } return 0; } int main(){ while( scanf("%d", &n) != EOF){ int b, k; memset( a, 0, sizeof(a)); for(int i = 0; i < n; i++){ scanf("%d: (%d)", &b, &k ); for(int j = 0; j < k; j++){ scanf("%d", &b); a[i][b] = 1; } } int ans = 0; memset( ma, 0xff, sizeof(ma)); memset( mb, 0xff, sizeof(mb)); for(int i = 0; i < n; i++){ if( mb[i] == -1 ){ memset( vis, 0, sizeof(vis)); ans += path( i ); } } printf("%d\n", n-ans/2 ); } }