int tree[N], deep[N];
void init()//初始化一个含有n个元素的并查集,复杂度n
{
memset(tree, -1, sizeof(tree));
memset(deep, 0, sizeof(deep));
}
int find(int n)//查找n的根节点并压缩路径,复杂度1
{
if (tree[n] == -1)
{
return n;
}
return tree[n] = find(tree[n]);
}
void unit(int m, int n)//把两个独立的集合联系起来,复杂度1
{
int root_m, root_n;
root_m = find(m);
root_n = find(n);
if (root_m == root_n)
{
return;
}
if (deep[m] > deep[n])
{
tree[root_n] = root_m;
}
else
{
tree[root_m] = root_n;
if (deep[m] == deep[n])
{
deep[root_n]++;
}
}
}