Implementation:UnionFindSetおよびルックアップセット

4082 ワード

class UnionFindSet {

    private:

        int *pref;

        int *rank;

        int capacity;

    public:

        UnionFindSet(int n) {

            if (n <= 0) {

                capacity = 0;

                return;

            }

            capacity = n;

            pref = new int[n];

            rank = new int[n];

            for (int i=0; i<n; i++) {

                rank[i] = 0;

                pref[i] = i;

            }

        }

        

        int find(int s) {

            if (s >= capacity || s < 0) return -1;

            if (s == pref[s]) return s;

            return pref[s] = find(pref[s]);

        }

        

        void unite(int a, int b) {

            if (a >= capacity || b >= capacity || a < 0 || b < 0) return;

            int pa = find(a), pb = find(b);

            if (pa == pb) return; // already united

            if (rank[pa] < rank[pb]) {

                pref[pa] = pb;

            } else {

                pref[pb] = pa;

            }

            if (rank[pa] == rank[pb]) rank[pa]++;

        }

        

        bool same(int a, int b) {

            return find(a) == find(b);

        }

};

セットを調べて練習します