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 );
    }    
}

 

posted @ 2013-04-02 19:41  yefeng1627  阅读(551)  评论(0编辑  收藏  举报

Launch CodeCogs Equation Editor