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
",Result);
    return 0;
}
原文地址:https://www.cnblogs.com/Asurudo/p/9427239.html