int find(int x)//递归+压缩路径
{
return p[x] == x ? x : p[x] = find(p[x]);
}
int find(int x)// 朴素代码(没有压缩路径)
{
int y = x;
while (ch[y] != y)
y = ch[y];
return y;
}
int find(int x)//朴素代码+压缩路径
{
int y = x,k,j;
while (ch[y] != y)
y = ch[y];
k = x;
while (k != y)
{
j = ch[k];
ch[k] = y;
k = j;
}
return y;
}
/*
下面讨论三种情况(较大根节点内容赋值为较小根节点的值):
(1)给一组样例
2 1
3 2
4 3
这种情况,有或没有压缩路径都一样(因为刚开始就是最小的节点作为根节点)
(2)给一组样例
5 4
4 3
3 2
2 1
这种情况也是,有或没有压缩路径都一样,查询起来都比较慢
(3)给一组样例
5 4
4 3
3 2
2 1
5 6
这种情况才能体现出压缩路径,前四组有没有压缩路径都一样,最后一组样例,5 6,当查询5的根节点时,就压缩了路径!
*/
ACM_并查集
最新推荐文章于 2022-05-08 17:30:36 发布