Cod sursa(job #1815457)

Utilizator andreiugravuFMI Andrei Zugravu andreiugravu Data 25 noiembrie 2016 11:43:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
//Paduri de multimi disjuncte

#include <fstream>

using namespace std;

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

#define maxN 100005

int N, M;
int tata[maxN];
int h[maxN];
//int root[maxN];
int root1, root2;
int i, cod, x, y;

void reuniune() {
    if(tata[x] == 0) root1 = x;
    else {
        root1 = tata[x];
        while(tata[root1] != 0)
            root1 = tata[root1];
    }

    if(tata[y] == 0) root2 = y;
    else {
       root2 = tata[y];
       while(tata[root2] != 0)
            root2 = tata[root2];
    }

    if(h[root1] >= h[root2]) {
        tata[root2] = root1;
        h[root1] += h[root2];
    }
    else {
        tata[root1] = root2;
        h[root2] += h[root1];
    }

}

void verificare() {
    if(tata[x] == 0) root1 = x;
    else {
        root1 = tata[x];
        while(tata[root1] != 0)
            root1 = tata[root1];
    }

    if(tata[y] == 0) root2 = y;
    else {
       root2 = tata[y];
       while(tata[root2] != 0)
            root2 = tata[root2];
    }

    if(root1 == root2)
        fout<<"DA\n";
    else
        fout<<"NU\n";
}

int main()
{
    fin>>N>>M;
    for(i = 1 ; i <= N ; i++)
        h[i] = 1;

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

        int j;


        if(cod == 1) {
            reuniune();
        }
        else {
            verificare();
        }
    }

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

    return 0;
}