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
今日推荐
周排行