并查集

2020-08-13  本文已影响0人  不再_犹豫
int fa[MAXN];
#初始化
for (int i = 0; i <= n; ++i)
        fa[i] = i;
#查找
###简单查找
public int find(int x)
{
    if(fa[x] == x)
        return x;
    else
        return find(fa[x]);
}
###路径压缩查找
public int find(int x)
{
    if(x == fa[x])
        return x;
    else{
        fa[x] = find(fa[x]);  //父节点设为根节点
        return fa[x];         //返回父节点
    }
}
public int find(int x)
{
    return x == fa[x] ? x : (fa[x] = find(fa[x]));
}
#合并
###普通合并
public void merge(int i, int j)
{
    fa[find(i)] = find(j);
}
###按秩合并
inline void merge(int i, int j)
{
    int x = find(i), y = find(j);    //先找到两个根节点
    if (rank[x] <= rank[y])
        fa[x] = y;
    else
        fa[y] = x;
    if (rank[x] == rank[y] && x != y)
        rank[y]++;                   //如果深度相同且根节点不同,则新的根节点的深度+1
}

统计集合个数

for(int i = 0;i < n;i++){
    if(fa[i] == i){
        ans++;
    }
}

统计集合最大值

单独设置一个数组记录

上一篇 下一篇

猜你喜欢

热点阅读