并查集模板

并查集结构:

for (i = 0; i <= n; ++i)
 f[i] = i;

查找祖先:

int find(int x)
{
    if (x != f[x])
    {
        f[x] = find(f[x]);
    }
    return f[x];
}

合并操作:

经常使用的:
void Union(int x,int y)
{
    x = find(x);
    y = find(y);
    if (x != y)
    {
        f[y] = x;
        num[x] += num[y];//根记录子系的个数
    }
}
还有一种写法:
void Union(int root1, int root2)
{
     int x = FindSet(root1), y = FindSet(root2);
     if( x == y ) return ;
     if( rank[x] > rank[y] ) parent[y] = x;
     else{
         parent[x] = y;
         if( rank[x] == rank[y] ) ++rank[y];
     }
}
posted @ 2012-08-18 00:46  山路水桥  阅读(145)  评论(0编辑  收藏  举报