Cod sursa(job #2183868)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 23 martie 2018 15:24:34
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#define DIM 100005

using namespace std;

int N, M, root[DIM], count[DIM];
int op, a, b;

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

int root_get(int x){

    int var = x;

    while(var != root[var])
        var = root[var];

    while(x != root[x]){
        int aux = root[x];
        root[x] = var;
        x = aux;
    }

    return var;

}

void join(int x, int y){

    int a = root_get(x), b = root_get(y);

    if(a == b)
        return;

    if(count[a] >= count[b]){
        root[b] = a;
        count[a] += count[b];
    }else{
        root[a] = b;
        count[b] += count[a];
    }

}

void check(int x, int y){

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

}

int main(){

    fin >> N >> M;

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

    while( M -- ){

        fin >> op >> a >> b;

        if(op == 1)
            join(a, b);
        else
            check(a, b);

    }

    fin.close();
    fout.close();

    return 0;


}