问题分析
基础并查集,就是加了个人数统计。
#include <cstdio>
using namespace std;
const int N = 3e4+3;
int n,m,k, total[N], f[N], father, son;
int GetF(int v)
{
if(f[v]==v){
return v;
}
return f[v] = GetF(f[v]);
}
void merge(int u,int v)
{
int t1 = GetF(u);
int t2 = GetF(v);
if(t1!=t2){
f[t2] = t1; //t2归属于t1
total[t1] += total[t2]; //所以t2找到组织后t1的总人数要加上t2的总人数
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)&&(n+m)){
for(int i = 0; i < n; ++i){
f[i] = i;
total[i] = 1;
}
for(int i = 0; i < m; ++i){
scanf("%d%d",&k,&father);
for(int j = 1; j < k; ++j){
scanf("%d",&son);
merge(father,son);
}
}
printf("%d\n",total[GetF(0)]);//注意这里不可以写total[f[0]];
}
return 0;
}
本文介绍了一个基于并查集的数据结构算法案例,该算法用于解决特定的问题,通过加入人数统计的功能来实现对群体成员关系的有效管理。代码示例清晰地展示了如何初始化数据结构、查找根节点以及合并不同集合的过程。

被折叠的 条评论
为什么被折叠?



