Cod sursa(job #2247015)

Utilizator pinteastefanPintea Teodor Stefan pinteastefan Data 27 septembrie 2018 19:38:08
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;
int radacina[100001],numberOfNodesInATree[100001];

void intialisation(int nodes){
    for(int i = 1; i<= nodes; i++){
        radacina[i] = i;
        numberOfNodesInATree[i] = 1;
    }
}

int father (int nod){
    int tata = nod;
    while(radacina[tata] != tata){
        tata = radacina[tata];
    }
    while (radacina[nod] != nod){
        int auxiliar;
        auxiliar = nod;
        nod = radacina[nod];
        radacina[nod] = tata;
    }
}

void unire (int a ,int b){
    int c = father(a);
    int d = father(b);
    if (c == d){
        return;
    }
    if (numberOfNodesInATree[c] < numberOfNodesInATree[d]){
        radacina[c] = d;
    }
    else{
        radacina[d] = c;
    }
    if (numberOfNodesInATree[c] == numberOfNodesInATree[d]){
        numberOfNodesInATree[c] ++;
    }
}
int main() {
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");
    int n, m;
    f >> n >> m;
    intialisation(n);
    for(int i = 1; i <= m; i ++){
        int x, y, op;
        f >> op >> x >> y;
        if (op == 1){
            unire(x, y);
        }
        else{
            if(father(x) == father(y)){
                g << "DA\n";
            }
            else{
                g << "NU\n";
            }
        }
    }
    return 0;
}