并查集模板函数 查找老大,建立关系

int Find(int x)//上面是一采用递归的方式压缩路径, 但是,递归压缩路径可能会造成溢出栈,
{
	if(pre[x] == x)
		return pre[x]; //从x结点搜索到祖先结点所经过的结点都指向该祖先结点
	return pre[x] = Find(pre[x]);  //回溯时的压缩路径
}
int Find(int x)//非递归方式进行的路径压缩:
{
	while(pre[x] != x) //当当前的值不等于他的pre[x]值表示还没有到头一直下去
	{
		int r = pre[x]; 
		pre[x] = pre[r];
 		x = r; //不断的更新操作
	}
	return x;
} 
void merge(int x, int y)//建立关系 
{
	int fx = Find(x);
	int fy = Find(y);
	if(fx != fy)
		pre[fx] = fy;
	return ;
}
bool merge(int x,int y)//判断是否存在关系(如果本来没有关系,就建立关系) 
	int fx = Find(x);
	int fy = Find(y);
	if(fx != fy)
	{
		pre[fx] = fy;
		return true;
	}
	return false;
}
bool same(int a, int b) //判断是否是一个老大 
{  
    return Find(a) == Find(b);  
} 

猜你喜欢

转载自blog.csdn.net/red_red_red/article/details/83927020