zoukankan      html  css  js  c++  java
  • 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 );
        }    
    }
  • 相关阅读:
    SQL Server 数据库基础编程
    Spring整合DWR comet 实现无刷新 多人聊天室
    SQL Server 数据库安全
    【MongoDB for Java】Java操作MongoDB
    SQL Server 触发器
    使用Dom4j操作XML
    BlazeDS 整合 Flex HelloWorld 示例
    SQL Server 索引和视图
    JDOM 操作XML
    SQL Server 数据库设计
  • 原文地址:https://www.cnblogs.com/yefeng1627/p/2996329.html
Copyright © 2011-2022 走看看