Cod sursa(job #2807383)

Utilizator amalia.gemanGeman Aamalia amalia.geman Data 23 noiembrie 2021 18:48:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
#define NMax 100001

using namespace std;

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


int N, M;   // nr de multimi(noduri), nr de operatii efectuate
int parinte[NMax];


int Find(int x)         // determina radacina arborelui din care face parte nodul x
{
    if(parinte[x] == x) // inseamna ca x insusi este radacina
        return x;
    else
    {
        parinte[x] = Find(parinte[x]); // apeleaza recursiv pana ajunge la radacina
        return parinte[x];
    }
}

void Union(int x, int y) // se reunesc multimile celor doua numere x si y
{                        // unim radacina lui x cu radacina lui y (adaugand rad lui y la rad lui x)
    int a, b;
    a = Find(x);
    b = Find(y);
    parinte[b] = a;
}


int main()
{
    fin >> N >> M;

    for(int i = 1; i <= N; ++i) // initial fiecare nod este propriul sau parinte
        parinte[i] = i;

    for(int i = 1; i <= M; ++i)
    {
        int op, x, y;
        fin >> op >> x >> y;

        if(op == 1) // se reunesc multimile nodurilor x si y, adica vor avea acelasi parinte
            Union(x,y);
        else
        {
            int a = Find(x);  // daca nodurile x si y au aceeasi radacina atunci sunt din aceeasi multime
            int b = Find(y);
            if(a == b)
                fout << "DA\n";
            else
                fout << "NU\n";
        }
    }

    return 0;
}