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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现