// 初始化voidinit(int n){for(int i =0; i < n; i ++){
p[i]= i ;}}// 返回x所在集合的编号+顺便路径压缩intfind_root(int x){//if (p[x] != x) p[x] = find_root(p[x]) ;if(p[x]!= x){returnfind_root(p[x]);}return p[x];}// 合并两个集合,将j合并到i中去voidmerge(int i ,int j){
p[find_root(j)]=find_root(i);}
模板优化
// 初始化voidinit(){for(int i =1; i <= N ;++i){
s[i]= i ;
height[i]=0;}}voidadd(int x ,int y){
x =find_par(x);
y =find_par(y);// 相等,就任意选一个合并到另一个,高度+1if(height[x]== height[y]){
s[x]= y ;
height[x]= height[y]+1;}else{// 如果小于,则让高度小的合并到高度大的if(height[x]< height[y]){
s[x]= y ;}else{
s[y]= x ;}}}