数据结构:集合(并查集)

并查集是一种树型的高级数据结构,主要用于处理不相交集合的合并及查询问题。它在计算机科学中有着广泛的应用,例如求解最小生成树、亲戚关系的判定、确定无向图的连通子图个数、最小公共祖先问题等,都要用到并查集。

//集合
#include <stdio.h>
#define maxn 1000
int set[maxn]; //数组存集合

int Find(int s[], int x) //树根用负数存-1,-2,-3...
{
    while (s[x] >= 0) //数组s存放的是parent
        x = s[x];
    return x;
}
//判断两个元素是否在一个集合中:利用find 查看根

void Union(int s[], int Root1, int Root2) //此处root不是指存放负数的那个标志位,s[root]才是标志位
{
    s[Root1] = Root2; //root1并到root2
}

void Union2(int s[], int Root1, int Root2) //按秩合并,将总结点数存在根中并且取负,把矮树连在高树上面
{
    if (s[Root2] < s[Root1]) //标志位-B<-A 即B>A 所以把集合1并到集合2上
    {
        s[Root2] += s[Root1];
        s[Root1] = Root2;
    }
    else
    {
        s[Root1] += s[Root2];
        s[Root2] = Root1;
    }
}

//路径压缩find:反复调用原find去调用底部某个元素
int Find2(int s[], int x) //寻找根
{
    if (s[x] < 0) //找到集合的根
        return x;
    else
    {
        s[x] = Find2(s, s[x]);
        return s[x];
    }
}

路径压缩递归的理解:每次查询都做了优化处理
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章