并查集
1.普通并查集
int fa[N],n,m,x,y;
void init(){
for(int i=0;i<N;i++)fa[i]=i;
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int x,int y){
fa[find(x)]=fa[find(y)];
}
2.带权并查集
void init(){
for(int i=0;i<N;i++){
s[i]=i;
d[i]=0;
}
}
int find(int x){
if(x!=s[x]){
int t=s[x];
s[x]=find(s[x]);
d[x]+=d[t];
}
return s[x];
}
void merge(int a,int b,int v){
int ra=find(a),rb=find(b);
if(ra==rb){
if(d[a]-d[b]!=v)ans++;
}else{
s[ra]=rb;
d[ra]=d[b]-d[a]+v;
}
}
3.查询优化(路径压缩)
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}

浙公网安备 33010602011771号