实现代码:
#include<iostream>
using namespace std;
int parent[30001], setSize[30001]; // 定义parent数组和setSize数组
void init() {
for (int i = 1; i <= 30000; i++) {
parent[i] = i; // 初始化parent数组
setSize[i] = 1; // 初始化setSize数组
}
}
int find_root(int x) {
return x == parent[x] ? x : find_root(parent[x]); // 寻找根节点的函数
}
void unionXY(int x, int y) {
int x_root = find_root(x); // 找到x的根节点
int y_root = find_root(y); // 找到y的根节点
if (x_root != y_root) { // 如果x和y不在同一个集合中
if (setSize[x_root] > setSize[y_root]) {
parent[y_root] = x_root; // 将y的根节点设为x的根节点
setSize[x_root] += setSize[y_root]; // 更新x集合的大小
} else {
parent[x_root] = y_root; // 将x的根节点设为y的根节点
setSize[y_root] += setSize[x_root]; // 更新y集合的大小
}
}
}
int main() {
int n, m;
cin >> n >> m; // 输入n和m
init(); // 初始化集合
for (int i = 0; i < m; i++) {
int num, inum, setflag;
cin >> num; // 输入当前集合的元素个数
for (int j = 0; j < num; j++) {
cin >> inum; // 输入集合中的元素
if (j == 0) setflag = inum; // 如果是第一个元素,设为集合的标志元素
else{
unionXY(setflag, inum); // 将元素加入集合
}
}
}
int setMax = 0;
for (int i = 1; i <= n; i++) {
setMax = max(setMax, setSize[i]); // 计算最大朋友圈
}
cout << setMax << endl; // 输出结果
return 0;
}