Cod sursa(job #2763674)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 15 iulie 2021 22:35:30
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>

#define NMAX 100000 //o suta de mii

using namespace std;

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

int tt[NMAX + 1];
int RG[NMAX + 1];

int find(int x){
    int copie = x;

    while(tt[x] != x){
        x = tt[x];
    }

    int radacina = x;

    //scurtez drumul
    x = copie;
    while(x != tt[x]){
        int aux = tt[x];
        tt[x] = radacina;
        x = aux;
    }

    return radacina;
}

void unite(int A, int B){
    if(RG[A] > RG[B]){
        tt[B] = A;
    }
    else {
        tt[A] = B; //si la egalitate se intampla asta!
    }

    if(RG[A] == RG[B]){
        //daca aveau rangurile egale, si s-a intamplat TT[A] = B, cresc rangul lui B
        RG[B]++;
    }

}

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

    for(int i = 1; i <= N; i++){
        tt[i] = i;
    }

    for(int i = 1; i <= M; i++){
        int tip, a, b;
        fin >> tip >> a >> b;

        if(tip == 1){
            unite( find(a), find(b) );
        }
        else {
            if(find(a) == find(b)){
                fout << "DA\n";
            }
            else {
                fout << "NU\n";
            }
        }
    }

    return 0;
}