题目描述

有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二个整数(1≤n≤100)(用空格分隔)
接下来的k行,每行二个整数(用空格分隔)表示关系

输出

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

样例输入

6  3

1  2

1  3

4  5

样例输出

3 3

思路

这道题用并查集来做比较简单,首先我们将每个成员的父节点定义为自己,然后根据数据,将一家人合并,然后搜索所以成员,如果父节点是他自己,则代表一个家庭,只需再求出最大值就行

代码

#include<bits/stdc++.h>

using namespace std;

int father[100001];

int find(int x)//查集

{

       if(father[x]!=x)

       father[x]=find(father[x]);

       return father[x];

}

void unionn(int r1,int r2).//并集

{

       father[r2]=r1;

}

int main()

{

       int n,m;

       scanf("%d %d",&n,&m);

       for(int i=1;i<=n;i++)

       father[i]=i;//将所有人的父节点定义为自己

       for(int i=1;i<=m;i++)

       {

              int x,y;

              scanf("%d %d",&x,&y);

              father[x]=find(x);

              father[y]=find(y);

              if(father[x]!=father[y])//将未合并的合并

              unionn(father[x],father[y]);

       }

       int s=0,max1=0;

       for(int i=1;i<=n;i++)

       {

              int s2=0;

              if(find(i)==i)//如果一个人的父节点是他自己,代表一个家庭

              s++;

              for(int j=1;j<=n;j++)

              {

                     if(find(i)==find(j))//如果父节点相同,代表是这个家的人

                     s2++;//记家人数

              }

              max1=max(max1,s2);//取最大值

       }

       cout<<s<<" "<<max1;

}