这几天练习了并查集,之前其实学过这个东西,但了解的不深,这几天又加深了印象,以前听人说并查集是二叉树的基础,但我还没学过二叉树,还不清楚。
并查集实际上就是一种从底层往上找源头的算法,就比如你顺着黄河的任何一个入海口往上走都会能走到青藏高原上黄河的发源地,但你从发源地却不一定能走到一个特定的入海口,所以我们把发源地叫做父类,入海口叫做子类。并查集的算法就是由子类找父类。
并查集有几个代码模块1:初始化。 2:查找父类。 3:让两个不关联的并查集关联起来。4:压缩路径,使子类全部向最高级父类直接联系
1初始化
void setLeader()
{
int i = 1;
for(i = 1; i <= N; i++)
{
leader[i] = i; // 初始化时, 将自己初始化为自己的领导
}
}
2.查找最高领导
int findLeader(int n)
{
int r = n;
while(leader[r] != r)
{
r = leader[r]; // 没找到的话, 一直往上找
}
return r;
}
3.合并
void uniteSet(int leaderX, int leaderY)//x和y是已经知道的两个最高父类
{
leader[leaderX] = leaderY;
}
4.路径压缩
int i=x , j ;
while( i != r )