家庭问题
家庭问题
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交
:
143
测试通过
:
62
比赛描述
有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
1 #include<stdio.h> 2 int a[101],b[101]; 3 int getMinIndex(int i) 4 { 5 return a[i]==i?i:a[i]=getMinIndex(a[i]);// 若a[i]等于i,则返回i,否则将a[i]的值赋值为i 6 } 7 int main() { 8 int n,k,i,j; 9 scanf("%d%d",&n,&k); 10 for(i=1;i<=n;i++) 11 { 12 a[i]=i;//最开始的时候一个人一个家庭 13 b[i]=1;//每个家庭都是一个人 14 } 15 int p,q,maxNum=1; 16 while(k--) 17 { 18 scanf("%d%d",&i,&j); 19 p=getMinIndex(i); 20 q=getMinIndex(j); 21 if(p<q) 22 { 23 n--; 24 a[q]=p;// q人和p人是同一个家庭 25 b[p]+=b[q];// p人所在家庭的数量就是p的数量加上q人所在家庭的数量 26 if(b[p]>maxNum) 27 { 28 maxNum=b[p]; 29 } 30 } 31 else if(p>q) 32 { 33 n--; 34 a[p]=q; 35 b[q]+=b[p]; 36 if(b[q]>maxNum) 37 { 38 maxNum=b[q]; 39 } 40 } 41 } 42 printf("%d %d\n",n,maxNum); 43 }
`
作者:自为风月马前卒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。