反向并查集,一般是问摧毁点后还有几个连通块;我们可以把摧毁的点保存起来,然后反向一个一个的建,还有的是带权的,大于某一个值才能建,可以把值存起来,重大到小建,题目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;
浙公网安备 33010602011771号