Cod sursa(job #3292102)

Utilizator enedumitruene dumitru enedumitru Data 7 aprilie 2025 09:03:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
using namespace std;
ifstream f("disjoint.in"); ofstream g("disjoint.out");
int n,m,T[100020],R[100020];
int find(int x)
{   int rad=x;
    ///merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
    while(T[rad]!=rad) rad=T[rad];
    ///aplic compresia drumurilor
    while(T[x]!=x) {int y=T[x]; T[x]=rad; x=y;}
    return rad;
}
void unite(int x, int y)
{   ///unesc multimea cu rang mai mic de cea cu rang mai mare
    if(R[x]>R[y]) T[y]=x; else T[x]=y;
    ///in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
    if (R[x]==R[y]) R[y]++;
}
/**
int find(int x)
{   if(z==T[x]) return x;
    T[x]=find(T[x]);
    return T[x];
}
void unite(int x, int y)
{   if(R[x]>R[y]) T[y]=x; else T[x]=y;
    if (R[x]==R[y]) R[y]++;
}
*/
int main()
{   f>>n>>m;
    ///initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
    for(int i=1;i<=n;i++) {T[i]=i; R[i]=1;}
    for(int cd,x,y;m;m--)
    {   f>>cd>>x>>y;
        if(cd==2)
            ///verific daca radacina arborilor in care se afla x respectiv y este egala
            if(find(x)==find(y)) g<<"DA\n"; else  g<<"NU\n";
        else
            ///unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
            unite(find(x),find(y));
    }
    g.close(); f.close(); return 0;
}