家庭问题

家庭问题

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

 

`

 

posted @ 2017-03-29 18:49  自为风月马前卒  阅读(554)  评论(0编辑  收藏  举报

Contact with me