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

    }    

}

 

你可能感兴趣的:(poj)