【模板】并查集
int fa[MAXN], rank[MAXN];
inline void init(int n)
{
for (int i = 1; i <= n; ++i)
{
fa[i] = i;
rank[i] = 1;
}
}
int find(int x)
{
return x == fa[x] ? x : (fa[x] = find(fa[x])); // 路径压缩
}
inline void merge(int i, int j)
{
int x = find(i), y = find(j);
if (rank[x] <= rank[y])
fa[x] = y;
else
fa[y] = x;
if (rank[x] == rank[y] && x != y)
rank[y]++;
}
路径压缩和按秩合并如果一起使用,时间复杂度接近
O
(
n
)
O(n)
O(n),但是很可能会破坏rank
的准确性。如果要保证秩的准确性,需要使用非路径压缩的版本。