并查集模板
并查集模板
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)的偏移量

浙公网安备 33010602011771号