#include<stdio.h>
#include<stdlib.h>
struct node{
node* p;
int rank;
int x;
};
node* find(node* xp) {
node* wp, * yp = xp, * zp = xp;
while (yp->p != NULL) {
yp = yp->p;
}
while (zp->p != NULL) {
wp = zp->p;
zp->p = yp;
zp = wp;
}
return yp;
}
node* uni(node* xp, node* yp) {
node* up, * vp;
up = find(xp);
vp = find(yp);
if (up->rank <= vp->rank) {
up->p = vp;
if (up->rank == vp->rank)
vp->rank++;
up = vp;
}
else
vp->p = up;
return up;
}
int main() {
node x[4];
node y[4];
for (int i = 0; i < 4; i++) {
x[i].p=y[i].p=NULL;
x[i].x = i;
y[i].x = i + 4;
}
x[2].p = x[1].p = &(x[3]);
y[2].p = y[1].p = &(y[3]);
x[0].p = &(x[2]);
y[0].p = &(y[2]);
x[3].rank = 0, x[2].rank = x[1].rank = 1;
y[3].rank = 0, y[2].rank = y[1].rank = 1;
x[0].rank = 2;
y[0].rank = 2;
node* a = &(x[0]);
node* b = &(y[0]);
node* c = uni(a, b);
printf("%d", c->x);
return 0;
}
//输出结果为y[3]=7
离散集合操作
于 2024-03-26 12:01:38 首次发布