路径压缩
由来
并查集会被链卡,这里有一个有效的解决方法:路径压缩。
实现
既然我们利用dfs来进行处理,不如想想记忆化。我们把father[i]改一下定义,表示x的祖先,那么写法稍加改变。
int getfa(int x)
{
if (father[x]==x) return x;
father[x]=getfa(father[x]); //记忆化
return father[x];
}
这样效率就变成O(α),有证明说α为3~5(这是一个线性到常数的飞跃!),有兴趣可以自己去看,反正我是没看懂。
应用
1.寻找next
有些题目让你找下一个满足的位置,比如有一个01序列,让你找一个区间内的最靠右/左的0的位置,找到把0改成1。我们会想到用一个next数组表示下一个满足的位置在哪里,但是这样的话如果把0改掉,会引发一系列变动(用链表实现会导致已经被改成1的位置next出现错误,请读者自己思考~),那么我们就会想到用并查集来实现,每次只需要改变这次变成1的位置,