Union found

 Use array.

class UnionFound {
public:
    vector<int> v;
    int cnt;
    UnionFound(int n) {
        v = vector<int>(n);
        for (int i = 0; i < n; i++)
            v[i] = i;
        cnt = n;
    }
    int findParent(int i) {
        if (v[i] == i)  return i;
        v[i] = findParent(v[i]);
        return v[i];
    }
    void Union(int p, int c) {
        int pp = findParent(p);
        int cp = findParent(c);
        if (pp != cp) {
            v[cp] = pp;
            cnt--;
        }
    }
};

 Use map.

class UnionFound {
public:
    unordered_map<int,int> parents;
    int cnt = 0;
    void AddItem(int i) {
        parents[i] = i;
        cnt++;
    }
    int GetParent(int i) {
        if (parents[i] == i)    return i;
        return parents[i] = GetParent(parents[i]);
    }
    void Union(int p, int c) {
        int pp = GetParent(p);
        int cp = GetParent(c);
        if (pp != cp) {
            parents[cp] = pp;
            cnt--;
        }
    }
};
原文地址:https://www.cnblogs.com/JTechRoad/p/8993630.html