Cod sursa(job #3317577)

Utilizator Johnny16Filote Ionut Johnny16 Data 24 octombrie 2025 15:11:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f ("disjoint.in");
ofstream g ("disjoint.out");
vector<int> parinte;
vector<int> rang;
void initializare(int n){
    parinte.resize(n+1);
    rang.resize(n+1,0);
    for (int i=0;i<n;i++)
        parinte[i]=i;
}
int find_radacina(int i){
    if(parinte[i]==i)
        return i;
    return parinte[i]=find_radacina(parinte[i]);
}
void unire(int x, int y)
{
    int radacina_x=find_radacina(x);
    int radacina_y=find_radacina(y);
    if(radacina_x!=radacina_y)
    {
        if(rang[x]<rang[y])
        {
            parinte[radacina_x]=radacina_y;
        }
        else if(rang[y]>rang[x]){
            parinte[radacina_y]=radacina_x;
        }
        else{
            parinte[radacina_x]=radacina_y;
            rang[y]++;
        }
    }
}
int main()
{
    int n,m,cod,x,y;
    f>>n>>m;
    initializare(n);
    for(int i=0;i<m;i++)
    {
        f>>cod>>x>>y;
        if(cod==1)
        {
            unire(x,y);
        }
        else if(cod==2)
        {
            if(find_radacina(x)==find_radacina(y))
                g<<"DA\n";
            else
                g<<"NU\n";
        }
    }
    f.close();
    g.close();
    return 0;
}