Cod sursa(job #2797244)

Utilizator calinstefan025Avramoniu Calin calinstefan025 Data 9 noiembrie 2021 16:44:13
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std ;

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

int n , m , t[100005] , h[100005] , tx , ty ;

int findSet(int x) {
    while(t[x]!=x)
        x = t[x] ;
    return x ;
}

void unionSet(int x , int y) {
    if(h[x] > h[y]) {
        t[y] = x ;
    } else if(h[y] > h[x]) {
        t[x] = y ;
    } else {
        t[y] = x ;
        h[x]++ ;
    }
}

int main() {

    int x , y , operatie;
    fin >> n >> m ;

    for(int i = 1 ;i<=n ;i++) {
        t[i] = i ;
        h[i] = 1 ;
    }
    for(int i = 1 ;i<=m ;i++) {
        fin >> operatie >>  x >> y ;
        if(operatie == 1) {

            tx = findSet(x) ;
            ty = findSet(y) ;
            if(tx != ty) {
                unionSet(tx , ty) ;
            }

        } else if(operatie == 2){

            tx = findSet(t[x]) ;
            ty = findSet(t[y]) ;

            if( tx == ty )
                fout << "DA" << '\n' ;
            else fout << "NU" << '\n' ;

        }

    }
    return 0;
}