Cod sursa(job #2526024)

Utilizator vagrosuVictor Alessandru Grosu vagrosu Data 18 ianuarie 2020 10:41:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#define NMAX 200002

using namespace std;

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

int n, m;
int tata[NMAX], h[NMAX]; // h[x] = inalt arb cu rad x

int Find(int x); // returneaza radacina arborelui din care face parte x
void Union (int x, int y); // reuneste arborele din care face parte x cu cel in care face parte y
void citire();

int main()
{
citire();
    return 0;
}

void citire(){

fin >> n >> m;
for(int i = 1; i <= n; i++)
    tata[i] = 0,h[i]=0;
int cod, x, y;
for(int i = 1; i <= m; i++){
    fin >> cod >> x >> y;

    if(cod == 1) Union(x, y);
    else {

    if(Find(x) == Find(y)) fout << "DA" << '\n';
    else fout << "NU" << '\n';

    }
}
}

int Find(int x){

    int rad = x, y;
    while(tata[rad] != 0) rad = tata[rad];

    while(tata[x]){

        y = tata[x];
        tata[x]=rad;
        x=y;

    }

    return rad;

}

void Union(int x, int y){

   int rx = Find(x);
   int ry = Find(y);

   if(h[rx] > h[ry])
    tata[ry] = rx;
   else{ tata[rx] = ry;
   if(h[rx] == h[ry])

    h[ry]++;

   }
   // tata[ry] = rx;

}