每一条边记录每个节点到根节点的一个权值,这个权值由具体问题决定
考虑权值需要注意两个问题
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;
}