并查集

我转过一篇写的很棒的并查集算法详解

地址:http://blog.csdn.net/a2459956664/article/details/50614096

int par[maxn]  //父亲
int rank[maxn]  //树的高度

//初始化n个元素
void init(int n)
{
    for (int i= 0; i < n; i++){
        par[i] = i;
        rank[i] = 0;
    }
}

//查询树的根
int find(int x)
{
    if (par[x] == x){
        return x;
    }
    else{
        return par[x] = find(par[x]);
    }
}

//合并x和y所属的集合
void unite(int x, int y)
{
    x = find(x);
    y = find(y);
    if (x == y)
        return;
    if (rank[x] < rank[y]){
        par[x] = y;
    }
    else{
        par[y] = x;
        if (rank[x] == rank[y])
            rank[x]++;
    }
}

//判断x和y是否属于同一个集合
bool same(int x, int y)
{
    return find(x) == find(y);
}


你可能感兴趣的:(并查集)