5760: 家庭问题 并查集

描述

 

有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;
typedef long long ll;
const int N = 1e3+10,inf = 0x3f3f3f3f;
int f[N],a[N]; //f[i]表示i的父亲是谁,a[i]表示i所在的家族人数 
int n,m;
int find(int x)
{
    if(f[x]!=x)f[x] = find(f[x]);
    return f[x];
}
void merger(int x,int y)
{
    int dx = find(x);
    int dy = find(y);
    if(a[dx]<a[dy])swap(dx,dy);
    a[dx]+=a[dy];
    f[dy] = dx;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)f[i] = i,a[i] = 1;
    for(int i=1;i<=m;i++)
    {
        int x,y; cin>>x>>y;
        if(find(x)!=find(y))merger(x,y);
    }
    int cnt = 0,maxx = 0;
    for(int i=1;i<=n;i++)
    {
        if(f[i]==i)
        {
            cnt++;
            maxx = max(maxx,a[i]);
        }
    }
    cout<<cnt<<" "<<maxx;
     return 0;
}
复制代码

 

posted @   CRt0729  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示