并查集

并查集 (Union-Find Sets) 是一种简单而用途广泛的高级数据结构

并查集可以描述这样一个逻辑结构:有若干个元素,将其分成若干个不相交的集合,每个集合相互独立

使用并查集可以方便地进行以下两种操作:

      1.判断两个元素是否属于同一个集合

      2.合并两个元素所在的集合

  1. 并查集机构的储存结构为一棵采用双亲表示法的树,通常用数组来储存。每个元素还有权值:

#define MAX 1000
struct Union_Find_Sets
{
    int parent;
    int rank;
}set[MAX];

其中parent的值为正数时,表示该节点的父节点的下标值,为负数时表示该节点为根节点,其负数的绝对值为该集合包含节点的个数

rank则为权值,在不同的情况下有不同的含义,由程序员自己来决定

对于并查集主要有以下三种操作

//初始化并查集
void MakeSet()    
{
    int i;
    for (i = 0; i < MAX; i ++)
    {
        //初始阶段每个节点单独构成一个集合
        set[i].parent = -1;
        //权值的初始值视具体情况而定
        set[i].rank = 0;    
    }  
}

//查找包含节点x的集合的根节点,返回其下标
int FindSet(int x)    
{
    int i, tmp;
    for (i = x; set[i].parent >= 0; i = set[i].parent);

    //压缩路径,提高以后的查找效率
    while (i != x)    
    {
        tmp = set[x].parent;
        //把搜索路径上所有节点的父节点都直接改为根节点
        set[x].parent = i;    
        x = tmp;
    }

    return i;
}

//合并a和b所在的集合
void Union(int a, int b)    
{
    int fa, fb;
    fa = FindSet(a);
    fb = FindSet(b);
    
    //a和b已经在同一集合
    if (fa == fb)
        return;    

    //将较小的集合变为较大的集合的子集
    if (set[fa].parent < set[fb].parent)    
    {
        set[fa].parent += set[fb].parent;
        set[fb].parent = fa; 
    }
    else
    {
        set[fb].parent += set[fa].parent;
        set[fa].parent = fb;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值