quick-find

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
#include <string.h>

struct UnionFindSet
{
    int *ID;
    int GroupSum;
    int WeightOriginalTotal;
};

struct UnionFindSet* UnionFindSetInit(int WeightTotal)
{
    struct UnionFindSet *UFSet = malloc(sizeof(struct UnionFindSet));
    
    UFSet -> GroupSum = WeightTotal;
    UFSet -> WeightOriginalTotal = WeightTotal;
    
    UFSet -> ID = malloc(WeightTotal*sizeof(int));
    
    int i;
    for(i = 0;i < WeightTotal;i ++)
    {
        UFSet -> ID[i] = i;
    }
    
    return UFSet; 
}

int UnionFindSetFind(struct UnionFindSet* UFSet,int WeightNum)
{
    if(WeightNum>UFSet -> WeightOriginalTotal-1 || WeightNum<0)
    {
        return -1;
    }
    return UFSet -> ID[WeightNum];
}

//return 1 if two are in the same weight,return 0 if everything ok,return -1 if ERROR
int UnionFindSetUnion(struct UnionFindSet* UFSet,int Weight_1,int Weight_2)
{
    int ID_1 = UnionFindSetFind(UFSet,Weight_1);
    int ID_2 = UnionFindSetFind(UFSet,Weight_2);
    
    if(ID_1 == -1 || ID_2 == -1)
    {
        return -1;
    }
    if(ID_1 == ID_2)
    {
        return 1;
    }
    
    int i;
    
    for(i = 0;i < UFSet -> WeightOriginalTotal;i ++)
    {
        if(UFSet -> ID[i] == ID_1)
        {
            UFSet -> ID[i] = ID_2;
        }
    }
    UFSet -> GroupSum --;
    return 0;
}

bool UnionFindSetIsConnected(struct UnionFindSet* UFSet,int Weight_1,int Weight_2)
{
    return (UnionFindSetFind(UFSet,Weight_1) == UnionFindSetFind(UFSet,Weight_2));
}

int main()
{
    int i;
    
    struct UnionFindSet *UFSet = UnionFindSetInit(10);
    UnionFindSetUnion(UFSet,4,3);
    UnionFindSetUnion(UFSet,3,8);
    UnionFindSetUnion(UFSet,6,5);
    UnionFindSetUnion(UFSet,9,4);
    UnionFindSetUnion(UFSet,2,1);
    UnionFindSetUnion(UFSet,8,9);
    UnionFindSetUnion(UFSet,5,0);
    UnionFindSetUnion(UFSet,7,2);
    UnionFindSetUnion(UFSet,6,1);
    UnionFindSetUnion(UFSet,1,0);
    UnionFindSetUnion(UFSet,6,7);
    
    bool Result = UnionFindSetIsConnected(UFSet,0,1);
    printf("%d\n",Result);
    return 0;
}

 

转载于:https://www.cnblogs.com/Asurudo/p/9427239.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值