Cod sursa(job #3142889)

Utilizator vladsipunct5555Butnrau Vlad vladsipunct5555 Data 25 iulie 2023 13:01:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");

int tata[100001];
int n, m;
int rang[100001];

int findd(int nod) {

    int c_nod = nod;

    while (tata[nod] != nod)
        nod = tata[nod];

    while (tata[c_nod] != nod) {

        int save = tata[c_nod];
        tata[c_nod] = nod;
        c_nod = save;
    }

    return nod;

}

void unionn (int x, int y) {

    int tatax = findd(x);
    int tatay = findd(y);

    if (tatax != tatay) {

        if (rang[tatax] > rang[tatay]) {
            rang[tatax] += rang[tatay];
            tata[tatay] = tatax;
        } else {
            tata[tatax] = tatay;
            rang[tatay] += rang[tatax];
        }
    }
}

bool verif(int x, int y) {
    int tatax = findd(x);
    int tatay = findd(y);

    if (tatax == tatay)
        return 1;
    return 0;
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; i ++)
        tata[i] = i, rang[i] = 1;

    for (int k = 1; k <= m; k ++) {
        int q, x, y;
        fin >> q >> x >> y;

        if (q == 1)
            unionn(x, y);
        else if (verif(x, y))
            fout << "DA" << endl;
        else
            fout << "NU" << endl;

    }
    return 0;
}