并查集是一种用来管理元素分组情况的数据结构。

朴素并查集(带路径压缩)

// 每个点的父亲节点
int p[N];
// 每个集合的大小
int sz[N];

void init(int n) {
    for (int i = 1; i <= n; i ++ ) {
        p[i] = i;
        sz[i] = 1;
    }
}

int find(int x) {
    // 递归的路径压缩
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

void merge(int x, int y) {
    x = find(x), y = find(y);
    if (x == y) return;
    p[x] = y;
    sz[y] += sz[x];
}

按秩合并的并查集

// 每个节点的父亲节点
int p[N];
// 每个节点的高度(简单起见,路径压缩后不修改)
int rank[N];
// 每个集合的大小
int sz[N];

void init(int n) {
    for (int i = 1; i <= n; i ++ ) {
        p[i] = i;
        rank[i] = 0;
        sz[i] = 1;
    }
}

int find(int x) {
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

void merge(int x, int y) {
    x = find(x), y = find(y);
    if (x == y) return;
    if (rank[x] > rank[y]) swap(x, y);
    p[x] = y;
    sz[y] += sz[x];
    if (rank[x] == rank[y]) rank[y] ++ ;
}

Hanson
12 声望2 粉丝

A lifelong programmer.


引用和评论

0 条评论