题目描述
有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;
}