pre[15]=3 表示 15的父节点是3 pre可以理解为求父节点的函数
查找x的父节点(附带路径压缩)
int fine(int x)
{
int r=x; 令r为代查询 r为x的父节点
while(pre[r]!=r) 查询父节点
直到r为根节点(因为根节点r的父节点就是它本身)
r=pre[r];
int i=x,j;
while(i!=r) 路径压缩
{
j=pre[i]; 记录X的父节点 (X==i)
pre[i]=r; 令x的父节点等于r(此时r为根节点,即最高级父节点)
i=j; 使i等于x的父节点
直到x的父节点变成根节点r
}
return r; 可以直接返回r 因为经过路径压缩,x的父节点已经变成根节点r
}
初始化 即将每个节点的父节点设为自己
合并两个子集
void join(int x,int y)
{
int a=fine(x); x的根节点为a
int b=fine(y); y的根节点为b
if(a!=b) 如果x,y的根节点(所在的集合)不同
{
pre[a]=b; 使x的根节点变成y的根节点
}
}
查找x的父节点(附带路径压缩)
int fine(int x)
{
int r=x; 令r为代查询 r为x的父节点
while(pre[r]!=r) 查询父节点
直到r为根节点(因为根节点r的父节点就是它本身)
r=pre[r];
int i=x,j;
while(i!=r) 路径压缩
{
j=pre[i]; 记录X的父节点 (X==i)
pre[i]=r; 令x的父节点等于r(此时r为根节点,即最高级父节点)
i=j; 使i等于x的父节点
直到x的父节点变成根节点r
}
return r; 可以直接返回r 因为经过路径压缩,x的父节点已经变成根节点r
}
初始化 即将每个节点的父节点设为自己
合并两个子集
void join(int x,int y)
{
int a=fine(x); x的根节点为a
int b=fine(y); y的根节点为b
if(a!=b) 如果x,y的根节点(所在的集合)不同
{
pre[a]=b; 使x的根节点变成y的根节点
}
}