Cod sursa(job #2944734)

Utilizator stefan431245Oprea Mihai-Stefan stefan431245 Data 22 noiembrie 2022 21:50:04
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;

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

int N, M, *multime, *rang_multime;

int find_radacina(int a){
    int radacina, aux;
    for(radacina = a; multime[radacina] != radacina; radacina = multime[radacina]);

    while(multime[a] != a){
        aux = multime[a];
        multime[a] = radacina;
        a = aux;
    }

    return radacina;
}

void unire_multimi(int a, int b){
    if(rang_multime[a] > rang_multime[b]){
        multime[b] = a;
        rang_multime[a]++;
    }
    else{
        multime[a] = b;
        rang_multime[b]++;
    }
}

int main()
{
    fin >> N >> M;
    int cod, x, y;
    multime = new int[N + 1];
    rang_multime = new int[N + 1];

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

    for(int i = 0; i < M; i++){
        fin >> cod >> x >> y;

        if(cod == 1){
            unire_multimi(find_radacina(x), find_radacina(y));
        }else{
            if(find_radacina(x) == find_radacina(y))
                fout << "DA\n";
            else fout << "NU\n";
        }
    }

    return 0;
}