#include <stdio.h>
//有的写法用到了树的深度,就是重新开一个数组ran[maxn];
//用来记录每个树的深度,合并的时候把深度较小的合并到较大的上边,防止出现最极端的情况。
//但是用上路径压缩的话就不需要这个数组,因为压缩过后深度都是 2 ,随意操作;
//压缩就是把/* */里面的 par[x] = 加上,不加上去的话只查找,没有压缩;
//附上带ran[]数组的合并;
//如果用ran[]数组,尽量不要用rank[] rank再后边学习的时候是一个关键字;
void unite()
{
int fa = find(a);
int fb = find(b);
if (fa == fb)
return ;
if (ran[fa] < ran[fb]) //如果a树的深度小于b树 就把a树忘b树上合并;
par[fa] = fb;
else
{
par[fb] = fa;
if (ran[fa] == ran[fb])
ran[fa]++;
}
}
const int maxn = 1e6 + 10;
int par[maxn];
void init(int n)
{
for (int i = 0; i <= n; i++)
par[i] = i;
}
//压缩和不压缩的都要知道,后边有时会处理不压缩的;
int find(int x)
{
1. if ( x!= par[x])
return /* */find(par[x]);
return x;
2. return x == par[x] ? x : /* */find(par[x]);
3. int p = x, q = x;
while (x != par[x])
x = par[x];
/*
while (par[q] != x)
{
int j = par[q];
par[q] = x;
q = j;
}
*/
return par[x];
}
void unite(int a, int b)
{
int fa = find(a);
int fb = find(b);
if (fa != fb)
par[fa] = fb;
}
int main()
{
return 0;
}