带权并查集
很新奇啊这个东西。
用来解决形如 \(x_i - x_j = y\) 系列方程组有无解的问题。
思路很简单,\(dis_i\) 代表从 \(i\) 的祖先与 \(i\) 之间的差值。
这样能秒算出方程组中任意两个点的差值。
本质是每次把两个方程组合并。
找祖先部分:
int findpa(int x) {
if(fa[x] != x) {
int f = fa[x];
fa[x] = findpa(fa[x]);
dis[x] += dis[f];
}
return fa[x];
}
合并方程组:
if(fx != fy || (fx == fy) && dis[a] - dis[b] == c) {
fa[fx] = fy;
dis[fx] = c + dis[b] - dis[a];
num ++;
}