大年初一的, 复习了一下并查集, 用的教材上面写的并查集实际上用起来总感觉很别扭, 比如索引不是从0开始, 没有对处于同一集合内的元素作判断, 以及用了树作为存储集合根结点的数据结构, 于是便自己写了个C++版的.
vector<int> parents;
int find_mfset(int i,int j=0){
if(i<0 || i>parents.size()) return -1;
for(j=i;parents[j]>=0;j=parents[j]);
return j;
}
void merge_mfset(int i,int j){
if (i<0 || i>parents.size() || j<0 || j>parents.size()) return;
int pi = find_mfset(i);
int pj = find_mfset(j);
if(pi==pj) return;
if (pi > pj) {
parents[pj] += parents[pi];
parents[pi] = pj;
}
else {
parents[pi] += parents[pj];
parents[pj] = pi;
}
}