int Find(int i) { if(i>=setssize) return error i; while(tree[i]!=-1) i=tree[i]; return i; } int CollapsFind(int i) { if(i>=setssize) return error i;<span style="white-space:pre"> </span> int queryi=i;//modified in finding parent //finding parent while(tree[i]!=-1) i=tree[i]; int parent=i; i=queryi;//source i int oriparent; while(tree[i]!=-1) { oriparent=tree[i]; tree[i]=parent; i=oriparent; }<span style="white-space:pre"> </span>return parent;} void MergeSets(int i1, int i2) { int p1=Find(i1),p2=Find(i2); if(p1==p2) {same sets return;} else { if(p2 is taller than p1) tree[p1]=p2; else tree[p2]=p1; } }由于几年前学过就很少碰,有点生,其实实现不难,复习比较重要。这个是我实现的版本,包括压缩路径其实都是很好理解和实现的,第一次会比较慢,等到压缩了树的高度后,后面查找速度会明显提高。