1) 并查集的构造与路径压缩:
1.直接构造与压缩
int find(int x)
{
int r = x;
while(set[r] !=r)
r = set[r];
int j = x;
while(j != r)
{
int tmp =set[j];
set[j] = r;
j = tmp;
}
return r;
}
2.递归构造与压缩
int find(int x)
{
return set[x] != x? set[x] = find(set[x]) : x;
}
//或者:
int find(int x)
{
if(x ==set[x])
returnx;
set[x] = find(set[x]);
return set[x];
}
2) 并查集的合并
void merger(int x,int y )
{
x = find(x);
y = find(y);
if(x != y)
set[x] = y;
}