每一条边记录每个节点到根节点的一个权值,这个权值由具体问题决定
考虑权值需要注意两个问题
1.每个节点记录的都是与根节点的权值,路径压缩时,权值也应该更新
int find(int x){
if(x!=fa[x]){
int t=fa[x];
fa[x]=find(fa[x]);
v[x]+=v[t];
}
return fa[x];
}
2.并查集做合并时,权值应该更新,因为两个并查集的根节点不同
int px=find(x);
int py=find(y);
if(px!=py){
fa[px]=py;
v[px]=-v[x]+v[y]+s;
}