并查集模板

并查集模板

int find(int x){
	if(x==fa[x]) return x;
	else{
	fa[x]=find(fa[x]);
	return fa[x];
}

int find(int x){
	return fa[x]==x ? x : fa[x]=find(fa[x]);
}

void unity(int x,int y){
	fa[find(y)]=find(x);
}


维护size ‘’ 整个集合节点数 ‘’ 的并查集

//p[]存储每个点的祖宗节点,size[]只有祖宗节点有意义,
 int p[N],size[N];
//返回x的祖宗节点
int find(int x)
{
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
//初始化,假定节点编号是1~n
for(int i=1;i<=n;i++)
{
    p[i]=i;
    size[i]=1;
//因为初始的时候每个集合只有一棵树,所以都为 1
}
//合并a和b所在的两个集合
size[find(b)]+=size[find(a)];
p[find(a)]=find(b);
//一定要先维护size,再合并并查集,否则find(b)和find(a)找的是同一个节点,没有意义了

维护到祖宗节点距离的并查集

  int p[N],d[N];
    //p存储每个点的祖宗节点,d[x]存储x到p[x]的距离
    int find(int x)
    {
        if(p[x]!=x)
        {
            int u=find(p[x]);
            d[x]+=d[p[x]];
            //路径压缩,同时累计到祖宗节点的距离
            p[x]=u;
        }return p[x];
    }
    for(int i=1;i<=n;i++)
    {
        p[i]=i;
        d[i]=0;
    }
    //合并a和b所在的两个集合
    p[find(a)]=find(b);
    d[find(a)]=distance;
    //根据具体问题初始化find(a)的偏移量

posted @ 2025-05-19 17:28  cloudbless  阅读(19)  评论(0)    收藏  举报