并查集(模板)
1 int p[MAX];//父亲 2 int rank[MAX];//树的高度 3 4 //初始化n个元素 5 int init(int n) 6 { 7 for(int i=0; i<n; i++){ 8 p[i]=i; 9 rank[i]=0; 10 } 11 } 12 13 //查询树的根 14 int find(int x) 15 { 16 if(p[x]==x) 17 return x; 18 else 19 return p[x]=find(p[x]); 20 } 21 22 //合并x和y所属的集合 23 void unite(int x,int y) 24 { 25 x=find(x); 26 y=find(y); 27 if(x==y) return ; 28 if(rank[x]<rank[y]){ 29 p[x]=y; 30 } 31 else{ 32 p[y]=x; 33 if(rank[x]=rank[y]) 34 rank++; 35 } 36 }