并查集
朴素并查集:
void init()
{
for (int i = 1; i <= n; ++ i ) fa[i] = i;
}
int get(int x)
{
if (fa[x] == x) return x;
return fa[x] = get(fa[x]);
}
void merge(int x, int y)
{
fa[get(x)] = get(y);
}
维护size的并查集:
void init()
{
for (int i = 1; i <= n; ++ i ) { fa[i] = i; size[i] = 1; }
}
int get(int x)
{
if (x == fa[x]) return x;
return fa[x] = get(fa[x]);
}
// 按size合并
int merge(int x, int y)
{
if (size[get(x)] < size[get(y)])
{
fa[get(x)] = get(y);
size[get(y)] += size[get(x)];
}
else
{
fa[get(y)] = get(x);
size[get(x)] += size[get(y)];
}
}
维护到祖宗节点距离的并查集:
void init()
{
for (int i = 1; i <= n; ++ i ) { fa[i] = i; d[i] = 0; size[i] = 1; }
}
int get(int x)
{
if (x == fa[x]) return x;
int root = get(fa[x]);
d[x] += d[fa[x]];
return fa[x] = root;
}
void merge(int x, int y)
{
x = get(x), y = get(y);
fa[x] = y, d[x] = size[y];
size[y] += size[x];
}