家庭问题

来源:互联网 发布:scientific linux 界面 编辑:程序博客网 时间:2024/04/26 07:12
  • Description

有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}单独为一个家庭,第一个家庭的人数最多。

  • Input

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

  • Output

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

  • Sample Input

6 3
1 2
1 3
4 5

  • Sample Output

3 3

#include<iostream>using namespace std;#define Minn(x,y) ((x)<(y)?(x):(y))#define Maxx(x,y) ((x)>(y)?(x):(y))int father[102];int search(int i){    int r,l;    for(r=i;r!=father[r];r=father[r]);    l=i;    if(i!=r)        while(father[i]!=r)        {            l=father[i];            father[i]=r;            i=l;        }    return r;}void link(int a,int b){    int x=search(a),y=search(b);    int min,max;    min=Minn(x,y);    max=x+y-min;    father[max]=min;}int main(){    int n,k,i,x,y,cou=1,visit[102]={1,0},cc[102]={0},mm;    cin>>n>>k;    for(i=0;i<n;i++)        father[i]=i;    for(i=0;i<k;i++)    {        scanf("%d%d",&x,&y);        link(x,y);    }    for(i=0;i<n;i++)        search(i);    for(i=0;i<n;i++)    {        if(!visit[father[i]])        {            cou++;            visit[father[i]]=1;        }        cc[father[i]]++;    }    mm=-1;    for(i=0;i<n;i++)    {        if(cc[i]>mm)            mm=cc[i];    }    cout<<cou<<" "<<mm<<endl;    return 0;}
0 0