Cod sursa(job #2525974)

Utilizator corinuta48Cantea Carmina Viviana corinuta48 Data 18 ianuarie 2020 09:53:33
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
#define NMAX 100002

using namespace std;

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

int n, m;
int tata[NMAX];
int h[NMAX];

int Find(int x);
void Union(int x, int y);

int main()
{
    int o, x, y;
    in>>n>>m;
    for(int i=1;i<=m;i++){
        in>>o>>x>>y;
        if(o==1)
            Union(x, y);
        else{
            if(Find(x)==Find(y))
                out<<"DA"<<'\n';
            else out<<"NU"<<'\n';
        }
    }
    return 0;
}

int Find(int x){
    int rad=x, u;
    while(tata[rad]) rad=tata[rad];
    //compresez
    while(tata[x]){
        u=tata[x];
        tata[x]=rad;
        x=u;
    }
    return rad;
}

void Union(int x, int y){
    int rx, ry;
    rx=Find(x);
    ry=Find(y);
    if(h[rx]>h[ry])
        tata[ry]=rx;
    else{
       tata[rx]=ry;
       if(h[rx]==h[ry]) h[ry]++;
    }

}