Cod sursa(job #2824008)

Utilizator Titus_PirsanTitus-Teodor Pirsan Titus_Pirsan Data 30 decembrie 2021 16:31:59
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>

using namespace std;

const string filename = "disjoint";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");

class DSU {
   private:
    int parent;
    int size;

   public:
    static vector<DSU> makeDSU(const int &n) {
        vector<DSU> v(n + 1);
        for (int i = 1; i <= n; i++) {
            v[i].parent = i;
            v[i].size = 1;
        }

        return v;
    }

    static int findParent(int x, vector<DSU> &v) {
        while (v[x].parent != x) {
            v[x].parent = v[v[x].parent].parent;
            v[x].size = v[v[x].parent].size;
            x = v[x].parent;
        }
        return x;
    }

    static void unite(int x, int y, vector<DSU> &v) {
        x = findParent(x, v);
        y = findParent(y, v);

        if (x == y) {
            return;
        }

        if (v[x].size > v[y].size) {
            v[y].parent = x;
            v[x].size += v[y].size;
        } else {
            v[x].parent = y;
            v[x].size += v[x].size;
        }
    }

    static bool checkDSU(int x, int y, vector<DSU> &v) {
        if (findParent(x, v) == findParent(y, v)) {
            return 1;
        }
        return 0;
    }
};

int main() {
    int n, t;
    fin >> n >> t;

    vector<DSU> v = DSU::makeDSU(n);
    int c, x, y;

    while (t--) {
        fin >> c >> x >> y;

        if (c == 1) {
            DSU::unite(x, y, v);
        }
        if (c == 2) {
            if (DSU::checkDSU(x, y, v) == 1) {
                fout << "DA\n";
            } else {
                fout << "NU\n";
            }
        }
    }
    return 0;
}