南邮 OJ 1414 家庭问题

家庭问题

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 139            测试通过 : 61 

比赛描述

有n个人,编号分别为1,2,…n,另外还知道存在k个关系。一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员。

问题:当n,k和k个关系给出之后,求出其中共有多少个家庭、最大的家庭中有多少人。

例如:

n=6,k=3,三个关系为:(1,2),(1,3),(4,5)

此时,6个人组成三个家庭,

即:{1,2,3}为一个家庭,{4,5}为一个家庭,{6}单独为一个家庭,第一个家庭的人数最多。



输入

第一行为n,k二个整数(0≤n≤100)(用空格分隔),接下来的k行,每行二个整数(用空格分隔)表示关系

输出

二个整数(分别表示家庭个数和最大家庭人数)

样例输入

6 3
1 2
1 3
4 5

样例输出

3 3

提示

 

题目来源

JSOI2010



#include<stdio.h>
int a[101],b[101];
int getMinIndex(int i){
	return a[i]==i ? i : a[i]=getMinIndex(a[i]);
}
int main(){
	int n,k,i,j;
	scanf("%d%d",&n,&k);
	for(i=1; i<=n; i++){
		a[i] = i;
		b[i] = 1;
	}
	int p, q, maxNum = 1;
	while(k--){
		scanf("%d%d",&i,&j);
		p = getMinIndex(i);
		q = getMinIndex(j);
		if(p<q){
			n--;
			a[q] = p;
			b[p] += b[q];
			if(b[p]>maxNum){
				maxNum = b[p];
			}
		}else if(p>q){
			n--;
			a[p] = q;
			b[q] += b[p];
			if(b[q]>maxNum){
				maxNum = b[q];
			}
		}
	}
	printf("%d %d\n",n,maxNum);
}






你可能感兴趣的:(ACM,南邮OJ,家庭问题)