时间限制(普通/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 }
`