带权并查集维护任意两点之间具有可加、可差分性质的路径信息。
TODO
封装模板。
操作
路径压缩
int query(int x) {
if (x == c[x]) return x;
int old_fa = c[x];
c[x] = query(c[x]);
val[x] += val[old_fa];
return c[x];
}
合并
由于任意两点之间路径权值应该相同,所以可以得到
void merge(int u, int v, int w) {
if (connected(u, v)) return;
int u_root = query(u), v_root = query(v);
c[u_root] = v_root;
val[u_root] = - val[u] + val[v] + w;
}