并查集

并查集是一个树形的数据结构,每一个父节点的子节点都与它父亲具有关系属性(传递性),就相当于把一些具有相同属性的元素放进一个集合中。常常用于找祖宗(找共同)etc。

这个代码分为四部分:初始化,找父亲,合并, 查找。

1.初始化:

让他们自己是自己的父亲节点

void init(){
    for(int i=1;i<=n;i++){
        f[i]=i;
    } 
}

2.找父亲节点

当自己是自己父亲时便return,其余的时候路径压缩递归

int get_f(int v){
    if(f[v]==v) return v;
    else{
        return f[v]=get_f(f[v]);//路径压缩    
    }    
}    

3.合并

假如这两个点不具有同一父亲,就用靠左原则,都并到同同一父节点之下。

void merge(int v,int u){
    int t1,t2;
    t1=get_f(v);
    t2=get_f(u); 
    if(t1!=t2){ 
        f[t2]=t1; 
    }
    return ;
}

4.查询

一定要用get_f(x)而非f[x]

 

posted @ 2019-07-23 09:49  毛炯人  阅读(115)  评论(0编辑  收藏  举报