反向并查集,一般是问摧毁点后还有几个连通块;我们可以把摧毁的点保存起来,然后反向一个一个的建,还有的是带权的,大于某一个值才能建,可以把值存起来,重大到小建,题目p4185

带权并查集,就是点之间带有权值,我们可以开一个数组val【N】,表示这个点到根节点的全值,那么求两个点的权值就可以val[i]-val[j],经典题目是p2294

 1 int fa[N];
 2 int val[N];
 3 int f(int x) {
 4     if (fa[x] == x)
 5         return x;
 6     int r = f(fa[x]);
 7     val[x] += val[fa[x]];//必须再f(fa[x])之后
 8     return fa[x] = r;
 9 }
10 void merge(int x, int y, int w) {
11     int p1 = f(x);
12     int p2 = f(y);
13     fa[p1] = p2;
14     val[p1] = val[y] + w - val[x];
15 }//注意X,Y的指向,要统一,方便后面计算

种类并查集,用来描述种类,带权也能做,用权值来描述关系,种类更为简单

n为种类数,有几种关系就要开几倍长的n的数组,每一段n用来描述一段关系;

种类并查集与普通差不多,只不过每一次合并,要将对应关系全部和并,经典题目p2024;