合并两个不相交集合
操作很简单:先设置一个数组Father[x],表示x的“父亲”的编号。 那么,合并两个不相交集合的方法就是,找到其中一个集合最父亲的父亲(也就是最久远的祖先),将另外一个集合的最久远的祖先的父亲指向它。
void Union(int x,int y)
{
fx = getfather(x);
fy = getfather(y);
if(fy!=fx)
father[fx]=fy;
}
获取父亲元素
int getfather(int v)
{
if (father[v]==v)
return v;
else
{
father[v]=getfather(father[v]);//路径压缩
return father[v];
}
}
判断两个元素是否属于同一集合
bool same(int x,int y)
{
return getfather(x)==getfather(y);
}
并查集的优化
fillchar(rank,sizeof(rank),0);
void judge(int x ,int y)
{
fx = getfather(x);
fy = getfather(y);
if (rank[fx]>rank[fy])
father[fy] = fx;
else
{
father[fx] = fy;
if(rank[fx]==rank[fy])
++rank[fy];
}
}