并查集有三种操作:
1.初始化:
for(int i=1; i<=n; i++)
pre[i]=i;
把所有节点的根节点标记为自己。
2.查找:
//一种较为简单的路径压缩+查找
int find( int x )
{
return x == pre[x] ? x : pre[x] = find(pre[x]); //找祖先节点 + 路径压缩
}
\
int find(int x)//找到一个集合父节点
{
int r=x;
while(pre[r]!=r)
r=pre[r];
int i=x,j;
while(pre[i]!=r)//路径压缩,缩小寻找次数
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
找到一个元素的根节点,后面的是路径压缩,把一段很长的路压缩成可以直接一层找到的。
3.合并:
void mix(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
pre[fy]=fx;
}
合并操作是使两个节点的根节点变成一个。
关于并查集的详解,这里有一篇博客,深入浅出:
\