标签:
寻找祖先时采用递归,但是一旦元素一多起来,或退化成一条链,每次GetFather都将会使用O(n)的复杂度,这显然不是我们想要的。对此,我们必须要进行路径压缩,即我们找到最久远的祖先时“顺便”把它的子孙直接连接到它上面。这就是路径压缩了。使用路径压缩的代码如下,时间复杂度基
路径压缩可以采用迭代和递归方式递归方式实现简单但是有些题目会爆栈的。
//递归形式的路径压缩 int getf(int v) { if(v==f[v]) return v; return f[v]=getf(f[v]); }
//迭代形式的路径压缩 int getf(int v) { int p = v, t; while (f[p] != p) p = f[p];//找到祖先p while (v != p) { t = f[x]; f[x] = p; x = t; } //路径压缩 return v; }
void Merge(int x,int y) { int t1=getf(x),t2=getf(y); if(t1==t2) return ;//已合并返回 if(rnk[t1]>rnk[t2]) f[t2]=t1; //把y的祖先t2和并到x的祖先t1上。因以t1为根的树更高 else { f[t1]=t2; if(rnk[t1]==rnk[t2]) rnk[t2]++; //若两树一样高,那么合并后,高度加一。 } }
标签:
原文地址:http://blog.csdn.net/kalilili/article/details/43014623