算法-并查集

查询两个节点是否连接,把两个节点相连,并查集

#ifndef UNIONFIND_UNIONFIND5_H
#define UNIONFIND_UNIONFIN5_H
#include <iostream>
#include <cassert>
using namespace std;

namespace UF5{
class UnionFind{
private:
    int* parent;
    int* rank; // rank[i]表示以i为根的集合表示的树的层数
    int count;
public:
    UnionFind(int count){
        parent = new int[count];
        rank = new int[count];
        this->count = count;
        for(int i=0;i<count;i++){
            parent[i] = i;//初始化情况下父节点为自己
            rank[i] =1;
        }
    }
    ~UnionFind(){
        delete[] parent; 
        delete[] rank;
    }
    int find(int p){
        assert(p>=0 && p<count);
        // while(p !=parent[p]){
        //     parent[p] = parent[parent[p]]; //路径压缩
        //     p = parent[p];
        // }
        // return p;
        if(p!=parent[p])
            parent[p] = find(parent[p]);
        return parent[p];
    }
    bool isConnected(int p,int q){
        return find(p) == find(q);
    }
    void unionElements(int p,int q){
        int pRoot = find(p);
        int qRoot = find(q);

        if(pRoot == qRoot)
            return;
        if(rank[pRoot] < rank[qRoot]){
            parent[pRoot] = qRoot;
        }
        else if(rank[qRoot] < rank[pRoot]){
            parent[qRoot] = pRoot;
        }else{
            parent[pRoot] = qRoot;
            rank[qRoot] +=1;
        }
        
        
    }
};
}

#endif

猜你喜欢

转载自www.cnblogs.com/Erick-L/p/12616492.html
今日推荐