Disjoint sets(并查集)

来源:互联网 发布:微信发淘宝优惠券软件 编辑:程序博客网 时间:2024/06/05 03:50

PAT 1013

并查集算法是一种用于计算集合之间关系的高效算法,根据具体应用场景,如果集合内部元素之间的关系不重要,可以选择路径压缩,以获得更高的查找效率。算法的关键步骤分为三步:初始化、合并(包含查找过程)以及结果统计。

1、初始化

每个元素都是一个独立的集合,集合个数为n

int pre[N];
//数组中包含所有集合的所有元素for(int i = 1; i <= n; ++i) pre[i] = i;    //n为实际元素个数,N为最大可能的元素个数

2、合并(包含查找)

如果内部元素之间的关系不重要,可采用路经压缩

int find(int x){//递归查找根节点,使用路径压缩    if(pre[x] == x) return x;    else return pre[x] = find(pre[x]);}

void union(int a, int b){//如果a,b根节点不同则合并    int ra = find(a);    int rb = find(b);    if(ra != rb)    pre[ra] = rb;}

3、统计结果

        如果pre数组中的元素为根节点,则该元素在pre数组中的值仍然等于下标值

    

for(int i = 1; i <= n; ++i)    if(pre[i] == i)        ++cnt;

0 0
原创粉丝点击