这个博客写的不错:
https://blog.youkuaiyun.com/u013546077/article/details/64509038
int pre[1000];
int find(int x) //查找根节点
{
int r=x;
while ( pre[r] != r ) //不是祖先,就继续往上找
r=pre[r];
int i = x , j ;
while( i != r ) //路径压缩
{
j = pre[ i ]; // 在改变上级之前用临时变量 j 记录下他的值
pre[ i ] = r ; //把上级改为根节点
i=j;
}
return r ;
}
void join(int x,int y) //判断x y是否连通,
//如果已经连通,就不用管了 如果不连通,就把它们所在的连通分支合并起,
{
int fx = find(x),fy = find(y); //分别查找x,y的祖先
if(fx != fy) //如果不属于一个集合,就将一个集合的祖先设置为另一个集合的祖先
pre[fx] = fy;
}