Cod sursa(job #2951581)

Utilizator dana24hdDana N dana24hd Data 6 decembrie 2022 19:32:29
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n;
const int M = 100001;
int tata[M];
int rang[M];

void create(){
    for(int i=1; i<=n; i++)
        tata[i]=i, rang[i]=0;
}

int Find(int x){

    if( x != tata[x] )
        tata[x] = Find( tata[x] );

    return tata[x];
}

void Union(int x, int y){

    int rootx = Find(x);
    int rooty = Find(y);

    /// in acelasi arbore
    if( rootx == rooty )
        return;

    int rangx = rang[x];
    int rangy = rang[y];

    /// punem arborele cu rang mai mic in cel cu rang mai mare
    if( rang[x]<rang[y] ){
        tata[x] = y;
    } else {
        if( rang[y]<rang[x] ){
            tata[y] = x;
        } else {
            tata[x] = y;
            rang[y]++;
        }
    }

}

int main()
{
    in>>n;

    int op;
    in>>op;

    create();

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

    return 0;
}