题目描述
有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,0<=k<=1000)(用空格分隔)。 接下来的k行,每行二个整数(用空格分隔)表示关系。
输出
二个整数(分别表示家庭个数和最大家庭人数)。
样例
输入
6 3
1 2
1 3
4 5
输出
3 3
AC代码:
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int find(vector<int>& parent, int x) {
if (parent[x] != x) {
parent[x] = find(parent, parent[x]);
}
return parent[x];
}
void merge(vector<int>& parent, vector<int>& size, int x, int y) {
int rootX = find(parent, x);
int rootY = find(parent, y);
if (rootX == rootY) {
return;
}
if (size[rootX] < size[rootY]) {
parent[rootX] = rootY;
size[rootY] += size[rootX];
} else {
parent[rootY] = rootX;
size[rootX] += size[rootY];
}
}
pair<int, int> countFamilies(vector<vector<int>>& relations, int n, int k) {
vector<int> parent(n + 1);
vector<int> size(n + 1);
for (int i = 1; i <= n; i++) {
parent[i] = i;
size[i] = 1;
}
for (auto& rel : relations) {
merge(parent, size, rel[0], rel[1]);
}
unordered_map<int, int> familyCount;
int maxFamilySize = 0;
for (int i = 1; i <= n; i++) {
int root = find(parent, i);
familyCount[root]++;
maxFamilySize = max(maxFamilySize, familyCount[root]);
}
return make_pair(familyCount.size(), maxFamilySize);
}
int main() {
int n, k;
cin >> n >> k;
vector<vector<int>> relations(k, vector<int>(2));
for (int i = 0; i < k; i++) {
cin >> relations[i][0] >> relations[i][1];
}
pair<int, int> result = countFamilies(relations, n, k);
cout << result.first << " " << result.second << endl;
return 0;
}