并查集及其算法实现

转自大佬的博客&第二位大佬的博客,如有侵权请告知,第一时间删除!


并查集是一种十分实用的数据结构,它主要用于处理一些不相交的合并问题。

并查集的基本操作有两个:

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;
        }

在这感谢两位大佬的博客让我理解了并查集!

猜你喜欢

转载自blog.csdn.net/hjl_heart/article/details/80317157