并查集
int p[N]; // 储存祖宗节点
int cnt[N]; // 用于统计集合元素个数
bool flag[N]; // 储存节点是否出现
init函数
void init()
{
for(int i = 1; i <= N; ++ i)
{
p[i] = i;
cnt[i] = 1;
}
}
find函数(包含路径压缩)
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
merge函数
void merge(int a, int b)
{
int fa = a, fb = b;
if(fa != fb)
{
p[fa] = fb;
// 统计集合内元素个数
cnt[fb] += cnt[fa];
}
}
统计集合个数
int fenzhi()
{
int res = 0;
for(int i = 1; i <= N; ++ i)
if(flag[i] && p[i] == i) ++ res; // flag[i] 用于记录元素是否出现
return res;
}
统计集合内元素个数
// 用cnt[N]记录元素个数,init()初始化赋值为1,merge()合并时需要注意
删除某个顶点
// 可以记录所有操作,删除节点后重新初始化,重新构造并查集
标签:cnt,int,31,查集,个数,2024.08,fa,fb From: https://www.cnblogs.com/Frodnx/p/18390083进阶:
带权并查集
拓展域并查集