描述
有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; }
标签:int,查集,二个,家庭,long,find,5760 From: https://www.cnblogs.com/jyssh/p/17362818.html