之前在博客上写过一篇并查集的文章,当时并没有用到路径压缩,效率较低,今天做到一道题发现使用朴素的并查集方案超时了,之后改用路径压缩通过了;因此在这里再讨论下使用路径压缩的并查集。
这是最朴素的并查集代码:
int find(int r) { while(r!=bin[r]) { r=bin[r]; } return r; }
int find(int r) { if(r!=bin[r]) { bin[r]=find(bin[r]); } return bin[r]; }
下面给出非递归的方式:
int find(int x) { int k, j, r; r = x; while(r != parent[r]) //查找跟节点 r = parent[r]; //找到跟节点,用r记录下 k = x; while(k != r) //非递归路径压缩操作 { j = parent[k]; //用j暂存parent[k]的父节点 parent[k] = r; //parent[x]指向跟节点 k = j; //k移到父节点 } return r; //返回根节点的值 }
原文:http://blog.csdn.net/zju_ziqin/article/details/19684005