并查集的整理

什么是并查集:

1:将n个不同的元素划分为不想交集合

2:在每个集合中,选择其中某个元素代表所在集合



三个基本操作

make_set(x):把每一个元素初始化为一个集合

find_set(x):查找一个元素所在的集合。在执行查找操作时,要沿着父结点指针一直找下去,直到找到树根为止

               判断两个元素是否属于同一集合,只要判断它们所在集合的祖先是否相同即可

                合并两个集合,也是将一个集合的祖先作为另一个集合的祖先

union_set(x,y):利用find_set()找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先


void make_set(int x)  //初始化,将每一个点变成一个集合
{
    fa[x]=x;   //该点的所对应的父结点
    rank[x]=0;  //以x为根节点的所对应的高度
}
int find_set(int x)  //查找一个元素所在的集合
{
    if(x!=fa[x]) fa[x]=find_set(fa[x]);  //利用递归的方式一直寻找到他的根结点
    return fa[x];
}

void union_set(int x,int y)  //利用find_set()找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先
{
    x=find_set(x);
    y=find_set(y);
    if(x==y) return ; //标识他们已经在相同的一个集合内
    if(rank[x]<rank[y]) fa[x]=y;  //以x为根节点的高度要小,所以讲x合并到y的集合内,就是x的父结点为y
    else{
        fa[y]=x;
        if(rank[x]=rank[y]) rank[x]++;  //两个的高度相同的话,以为这无论谁做根结点,他们多对应的高度都要加1;
    }
}


猜你喜欢

转载自blog.csdn.net/hujinhong145/article/details/80443675
今日推荐