并查集

并查集

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()合并时需要注意

删除某个顶点

// 可以记录所有操作,删除节点后重新初始化,重新构造并查集

进阶:
带权并查集
拓展域并查集

posted @ 2024-08-31 16:49  Frodnx  阅读(16)  评论(0)    收藏  举报