转自大佬的博客&第二位大佬的博客,如有侵权请告知,第一时间删除!
并查集是一种十分实用的数据结构,它主要用于处理一些不相交的合并问题。
并查集的基本操作有两个:
1.合并
union(x,y):目的是把元素x和元素y所在的集合合并,其中x和y所在集合不相交,若两个集合
相交,则不合并
代码如下:
//判断x、y是否连通,即x、y所在集合是否相交,若不相交则两者合并,反之则不用合并
public static void join(int x,int y)
{
int fx = find(x); //find(x)是找到x的根节点
int fy = find(y); //find(y)是找到y的根节点
if(fx != fy) //通过对两者根节点是否相同,来判断两个集合是否相交
{
pre[fx] = fy; //将fx的前导点设为fy,即让两处未连通的地方连通.其中pre[fx]=fy,表示fx的前导点为fy
}
}
2.查询
find(x):作用是找到元素x所在集合的根节点。我们通过判断两个集合根节点是否一致,来决定两者是否相交
代码如下:
public static int find(int x)
{
int r = x;
while(pre[r] != r) //如果r的前导点不是自己,则循环。直到找到x的根节点
r = pre[r];
int i = x,j;
//若i不是根节点,压缩路径算法.下面代码只是为了节省找到根节点的时间,若数据量较小时可以不要
while(i != r)
{
j = pre[i]; //把i的前导点赋给j
pre[i] = r; //把i的前导点直接设成根节点
i = j; //把i的前导点也设成根节点,直到i = r
}
return r;
}
在这感谢两位大佬的博客让我理解了并查集!