并查集简单模板
并查集结构:
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];
}
}


浙公网安备 33010602011771号