集合(并查集)

并查集:集合的并、查找某元素在什么集合。

这里写图片描述 这里写图片描述

//数组形式存储
typedef struct{
    ElementType Data;
    int Parent; //表示父节点下标,根节点为负数(绝对值为子节点个数)
}SetType;
int Find(SetType S[], ElementType X)
{
    //在数组S中查找值为X的元素所属的集合
    //MaxSize是全局变量,为数组S的最大长度
    int i;
    for(i=0; i<MaxSize && S[i].Data != X;i++);
    if(i >= MaxSize)
        return -1;
    //未找到X,返回-1
    for(;S[i].Parent >= 0;i = S[i].Parent);
        return i;
    // 找到X所属集合,返回树根结点在数组S中的下标
}
void Union(SetType s[], ElementType x1, ElementType x2)
{   //合并x1所在集合和x2所在集合,小的合并到大的
    int root1, root2;
    root1 = Find(s,x1);
    root2 = Find(s,x2);
    if(root1 == -1 || root2 == -1)
        return;
    if(root1>root2)
    {
        s[root2].Parent += s[root1].Parent;
        s[root1].Parent = root2;
    }
    if(root1<root2)
    {
        s[root1].Parent += s[root2].Parent;
        s[root2].Parent = root1;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值