转自大佬的博客&第二位大佬的博客,如有侵权请告知,第一时间删除!
并查集是一种十分实用的数据结构,它主要用于处理一些不相交的合并问题。
并查集的基本操作有两个:
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; }
在这感谢两位大佬的博客让我理解了并查集!