并查集

以下是并查集模板,核心数据结构是一个哈希表,(k,v)表示键以及该键的根结点,新key插入节点调用add函数在哈希表中插入(key,-1),寻找根节点是find函数,merge函数将两个树的根节点合并

class UnionFind{
public:
    // 记录父节点
    unordered_map<int,int> father;
    void add(int x){
        if(!father.count(x)){
            father[x] = -1;
        }
    }
    int find(int x){
        int root = x;
        while(father[root] != -1){
            root = father[root];
        }
        return root;
    }
    bool is_connected(int x,int y){
        return find(x) == find(y);
    }
    void merge(int x,int y){
        int root_x = find(x);
        int root_y = find(y);
        if(root_x != root_y){
            father[root_x] = root_y;
        }
    }
};