Cod sursa(job #2989241)

Utilizator iulia_mara81Dorhoi Iulia Mara iulia_mara81 Data 6 martie 2023 11:48:45
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX=100001;
int dad[NMAX];
int rnk[NMAX];

void init(){
    for(int i=1;i<=N;i++)
        dad[i]=i;
}

int do_find(int nod){
    if(dad[nod]!=nod){
        int rpr=do_find(dad[nod]);
        dad[nod]=repr;// compresia drumurilor
        return repr;
    }
    return dad[nod];
}

int do_union(int n1,int n2){
    //union by rank
    int rx=do_find(n1);
    int ry=do_find(n2);
    if(rnk[rx]==rnk[n2]){
        dad[rx]=ry;
        rnk[ry]++;
    } else if(rnk[rx]<rnl[ry]){
        dad[rx]=ry;
    }
    else{
        dad[ry]=rx;
    }
}

int main()
{
    fin>>N>>M;
    init();
    for(int i=1;i<=M;i++){
        int cod,x,y;
        if(cod==1){
                int rx=do_find(x);
        int ry=do_find(y);
        do_union(rx,ry);
        }else{
            int rx=do_find(x);
            int ry=do_find(y);
            if(rx==ry){
                cout<<"DA\n";
            }
            else{
                cout<<"NU\n";
            }
        }
    }
}