Files
cAI/cKit/Graph/c_QuickFindUF.c
T

46 lines
1.1 KiB
C
Raw Normal View History

2026-08-10 01:21:15 +08:00
#include <c_QuickFindUF.h>
#include <c_Memory.h>
c_err_t c_QuickFindUF_Init(c_QuickFindUF_t* self, c_size_t n) {
if (!self || n==0) return C_ERR_PARAM;
self->count = n;
self->id_len = n;
self->id = C_ALLOC(sizeof(c_size_t) * n);
if (!self->id) {
return C_ERR_NOMEM;
}
for (c_size_t i=0; i<self->id_len; i++) {
self->id[i] = i;
}
return C_ERR_OK;
}
void c_QuickFindUF_Destroy(c_QuickFindUF_t* self) {
C_FREE(self->id);
self->count = 0;
self->id_len = 0;
}
c_size_t c_QuickFindUF_Find(c_QuickFindUF_t* self, c_size_t index) {
if (!self || self->id==NULL || index>=self->id_len) {
return (c_size_t)-1;
}
return self->id[index];
}
c_err_t c_QuickFindUF_Union(c_QuickFindUF_t* self, c_size_t p, c_size_t q) {
if (self == NULL || self->id == NULL) return C_ERR_PARAM;
if (p >= self->id_len || q >= self->id_len) return C_ERR_PARAM;
c_size_t pID = self->id[p];
c_size_t qID = self->id[q];
if (pID==qID) return C_ERR_OK;
for (c_size_t i=0; i<self->id_len; i++) {
if (self->id[i] == pID) self->id[i] = qID;
}
self->count--;
return C_ERR_OK;
}