zoukankan      html  css  js  c++  java
  • (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);
    	}
    }
    
    
    






  • 相关阅读:
    Oracle 12C ORA-65096: 公用用户名或角色名无效
    一张图记住PMP十大只是领域
    MAC系统升级后APACHE/MYSQL相关问题解决
    Mac配置Apache
    Android源码下载方法
    GIT 远程操作详解
    GIT 配置及常用命令
    安装Oracle-Redhat 5.4 64位
    近期工作计划
    新的起点
  • 原文地址:https://www.cnblogs.com/pangblog/p/3293920.html
Copyright © 2011-2022 走看看