• (step6.3.2)hdu 1068(Girls and Boys——二分图的最大独立集)


    题目大意:第一行输入一个整数n,表示有n个节点。在接下来的n行中,每行的输入数据的格式是:

    1: (2) 4 6 :表示编号为1的人认识2个人,他们分别是4、6;

    求,最多能找到多少个人,他们互不认识


    解题思路:二分图的最大独立集。

    1)最大独立集 =  节点数 - 最大匹配数/2;

    2)令女生数= 男生数 = 总数

    3)   1: (2)可以采用scanf("%d: (%d)",&a,&b);来输入

    代码如下:

    /*
     * 1068_1.cpp
     *
     *  Created on: 2013年8月30日
     *      Author: Administrator
     */
    #include <iostream>
    
    using namespace std;
    
    const int maxn = 1001;
    int map[maxn][maxn];
    int link[maxn];
    bool useif[maxn];
    int n;
    
    int can(int t){
    	int i;
    	for(i = 0 ; i < n ; ++i){
    		if(useif[i] == 0 && map[t][i]){
    			useif[i] = 1;
    			if(link[i] == -1 || can(link[i])){
    				link[i] = t;
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    
    int max_match(){
    	int i;
    	int num = 0;
    	memset(link,-1,sizeof(link));
    	for(i = 0 ; i < n; ++i){
    		memset(useif,0,sizeof(useif));
    		if(can(i)){
    			num++;
    		}
    	}
    	return num;
    }
    
    int main(){
    	while(scanf("%d",&n)!=EOF){
    		int i,j;
    		memset(map,0,sizeof(map));
    		for(i = 0 ; i < n ; ++i){
    			int a,b;
    			scanf("%d: (%d)",&a,&b);
    			for(j = 0 ; j < b ; ++j){
    				int c;
    				scanf("%d",&c);
    				map[a][c] = 1;
    			}
    		}
    
    		printf("%d
    ",n - max_match()/2);
    	}
    }
    
    
    






  • 相关阅读:
    Delphi 学习笔记
    Extjs 4
    面向对象(OOP)
    Java基础
    Ubantu(乌班图)
    CentOS 6.3操作常识
    英语音标单元音篇
    英语音标双元音篇
    英语音标辅音篇
    Oracle补习班第一天
  • 原文地址:https://www.cnblogs.com/pangblog/p/3293920.html
Copyright © 2020-2023  润新知