(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",n - max_match()/2);

	}

}






 





 

你可能感兴趣的:(HDU)