int fa[MAXN];
#初始化
for (int i = 0; i <= n; ++i)
fa[i] = i;
#查找
###简单查找
public int find(int x)
{
if(fa[x] == x)
return x;
else
return find(fa[x]);
}
###路径压缩查找
public int find(int x)
{
if(x == fa[x])
return x;
else{
fa[x] = find(fa[x]); //父节点设为根节点
return fa[x]; //返回父节点
}
}
public int find(int x)
{
return x == fa[x] ? x : (fa[x] = find(fa[x]));
}
#合并
###普通合并
public void merge(int i, int j)
{
fa[find(i)] = find(j);
}
###按秩合并
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]++; //如果深度相同且根节点不同,则新的根节点的深度+1
}
统计集合个数
for(int i = 0;i < n;i++){
if(fa[i] == i){
ans++;
}
}
统计集合最大值
单独设置一个数组记录
网友评论