关于并查集的三种优化
声明:三种方法几乎没法同时优化,特定题目要求保留树结构,无法使用路径压缩。
1.路径压缩o(1)复杂度
只需要查根的时候直接指向根
int root (int x)
{
return fa[x]=fa[x]==x?x:root(fa[x]);
}
2.按秩合并(深度)
初始化都为一
int d[N];
for()
rnk[i]=1;
merge操作中,
if(rnk[x]>rnk[y])swap(x,y);
pre[x]=y;
if(rnk[x]==rnk[y])rnk++;
3.启发式合并(大小)
初始化同上;
if(sz[x]>sz[y])
swap(x,y);
pre[x]=y;
sz[y]+=sz[x];
1.路径压缩o(1)复杂度
只需要查根的时候直接指向根
int root (int x)
{
return fa[x]=fa[x]==x?x:root(fa[x]);
}
2.按秩合并(深度)
初始化都为一
int d[N];
for()
rnk[i]=1;
merge操作中,
if(rnk[x]>rnk[y])swap(x,y);
pre[x]=y;
if(rnk[x]==rnk[y])rnk++;
3.启发式合并(大小)
初始化同上;
if(sz[x]>sz[y])
swap(x,y);
pre[x]=y;
sz[y]+=sz[x];
全部评论
相关推荐
06-02 23:35
门头沟学院 后端 
点赞 评论 收藏
分享