1. 算法导论 – 并查集算法介绍
2.c/c++代码复现
/**
伪代码:
make-set(x):
x.p<-x
x.rank<-0
Union(x,y):
u<-Find(x) v<-Find(y)
if u.rank<=v.rank then
u.p = v
if u.rank = v.rank then v.rank = v.rank + 1
Find(x):
y<-x
while y.p != y:
y<-y.p
root <-y, y<-x
while y.p!=y
w<-y.p
y.p<-root
y<-w
return root
**/
#include <bits/stdc++.h>
using namespace std;
struct Node{
int p,rank;
};
Node node[100];
void make_set(int x){
node[x].p = x;
node[x].rank = 0;
}
int find(int x){
int y = x;
while(node[y].p != y){ //找父亲
y = node[y].p;
}
int root = y;
y = x;
while(node[y].p != y){ //路径压缩
int w = node[y].p;
node[y].p = root;
y = w;
}
return root;
}
void union1(int x,int y){
int u = find(x);
int v = find(y);
if (node[u].rank<=node[v].rank){
node[u].p = v;
if (node[u].rank == node[v].rank ){
node[v].rank ++;
}
}
else{
node[v].p = u;
}
}
void show(){
for(int i=1;i<=10;i++){
cout<<node[i].p<<" "<<node[i].rank<<endl;
}
}
//author: GUET_diadestiny
int main()
{
for(int i = 1; i <= 10; i++)
{
make_set(i);
}
show();
union1(1,2);
union1(1,3);
union1(7,8);
union1(8,9);
show();
for(int i = 1; i <= 10; i++)
{
cout<<find(i)<<endl;
}
return 0;
}