带权并查集

很新奇啊这个东西。

用来解决形如 \(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 ++;
} 
posted @ 2023-11-20 21:24  BrotherCall  阅读(2)  评论(0编辑  收藏  举报