并查集


inline int find(int x){
    return fa[x] == x ? fa[x] : fa[x] = find(fa[x]) ;
} 

并查集通过一个一维数组来实现,本质上是维护一个森林。刚开始的时候,森林里的每一个结点都是一个集合(也就是只有一个结点的树),之后根据题意,逐渐将一个个集合合并(也就是合并成一棵大树)。之后寻找时不断查找父节点,当查找到父结点为本身的结点时,这个结点就是祖宗结点。合并则是寻找这两个结点的祖宗结点,如果这两个结点不相同,则将其中右边的集合作为左边集合的子集(即靠左,靠右也是同一原理)。

例题

 

posted @ 2019-03-13 20:57  Isaunoya  阅读(200)  评论(0编辑  收藏  举报
TOP