普通并查集基本操作

来源:互联网 发布:韦东奕 知乎 编辑:程序博客网 时间:2024/05/22 10:52
#include <cstdio>#include <iostream>#include <cstdlib>#include <cstring>#define MAXN 1000using namespace std;int father[MAXN];//存储节点的父亲节点,如果父亲节点就是自己则说明是根节点int rank[MAXN];/*rank数组用来存储大树的秩并且作为大树的标记*///并查集的初始化void Init_set(){    int i;    for(i = 0; i < MAXN; i++){        father[i] = i;              //把所有的节点都初始化为根节点        rank[i] = 0;                //秩初始化为0    }}//递归查找int Find(int x){    if(x != father[x])              //不是根节点        father[x] = Find(father[x]);//递归查找并压缩路径    return father[x];}/*集合的合并*/void Union(int x, int y){    int root_x = Find(x);    int root_y = Find(y);    if(rank[root_x] > rank[root_y])        father[root_y] = root_x;    //把小树合并到大树    else if(rank[root_x] < rank[root_y])        father[root_x] = root_y;    //把小树合并到大树    else{            father[root_x] = root_y;            rank[root_y]++;         //相等的时候,将其中一个的秩加一    }}
0 0