题目链接:836. 合并集合 - AcWing题库
题目描述
如何理解find函数中的寻找根结点和路径压缩?
解答
原模板:
int find (int x)
{
if(x != p[x]) p[x] = find(p[x]);
return p[x];
}
可以把y总的模板拆分一下,会方便理解些
int find (int x)
{
if(x != p[x])
{
int t = find(p[x]); //寻找根结点,找到后回溯
p[x] = t; //路径压缩
}
return p[x];
}
也就不难理解Acwing 240 食物链这道题的find函数了:
int find(int x)
{
if (p[x] != x)
{
int c = find(p[x]); //寻找根结点,找到后回溯
d[x] += d[p[x]]; //回溯中更新到根结点的距离
p[x] = c; //路径压缩
}
return p[x];
}