Cod sursa(job #2193054)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 8 aprilie 2018 16:32:47
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>

#define MAX 100005
using namespace std;

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

int Arbore[MAX], Rank[MAX];

int findR(int val){
    int r = val, y;
    while(Arbore[r] != r) /// parcurg arborele pana gasesc un nod care pointeaza catre el insusi
        r = Arbore[r];

    while(Arbore[val] != val){ ///aplic compresia drumurilor
        y = Arbore[val];
        Arbore[val] = r;
        val = y;
    }
    return r;
}

void Union(int Rx, int Ry){
    if(Rank[Rx] > Rank[Ry])
        Arbore[Rx] = Ry;
    else Arbore[Ry] = Rx;

    if(Rank[Rx] == Rank[Ry]) ///daca sunt egale, crestem Rank-ul
        Rank[Ry]++;
}

int main()
{
    int n, m;
    fin >> n >> m;

    for(int i = 1; i <= n; ++i) /// la inceput fiecare pointeaza catre el si au lungime 1
    {
        Arbore[i] = i;
        Rank[i] = 1;
    }

    for(int i = 1; i <= m; ++i){
        int c, x, y;
        fin >> c >> x >> y;

        if(c == 1){
            Union(findR(x), findR(y)); ///unesc radacinile arborilor
        }
        else {
            if(findR(x) == findR(y)) ///verific daca au aceeasi radacina
                fout << "DA\n";
            else fout << "NU\n";
        }
    }
    return 0;
}