void init(int x) { for(int i=0;i<=x;i++) { par[i]=i; ran[i]=0; } }
int find(int x) { if(par[x]==x) return x; else return par[x]=find(par[x]); }
void unite(int x,int y) { int xx = find(x); int yy = find(y); if(xx==yy)//先找出父节点 如果相同就返回; return ; if(ran[x]>ran[y])//如果不相同就把矮的树加到高的树上,如果相同就直接把一颗加到另一颗上; par[y]=x; else if(ran[y]>ran[x]) par[x]=y; else { par[y]=x; ran[x]++; } }
原文地址:http://blog.csdn.net/u010123208/article/details/27568983