Cod sursa(job #2948581)

Utilizator mikkiMihai Pricope mikki Data 27 noiembrie 2022 21:07:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
//Complexitate: O(n*m)
#include <bits/stdc++.h>
using namespace std;

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

int inaltime[100001],tata[100001];


void initVectori(int n){
    for(int i=0; i<n;i++){
        tata[i]=i;
        inaltime[i]=0;
    }
}

int Find(int u)
{

    if(tata[u]==u)
        return u;

    return Find(tata[u]);

}


void Union(int u, int v)
{
    int r1=Find(u);
    int r2=Find(v);

    if(inaltime[r1] > inaltime[r2]) 
    {
        tata[r2] = r1;
        inaltime[r1]++;
        return;
    }

    if(inaltime[r2] > inaltime[r1])
    {
        tata[r1] = r2;
        inaltime[r2]++;
        return;
    }

    tata[r2] = r1;
    inaltime[r1]++;
}


int main()
{
    int n,m; 
    fin>>n>>m;

    initVectori(n);

    for(int i=0;i<m;i++)
    {
        int cod,x,y; 
        fin>>cod>>x>>y;

        if(cod == 1) 
            Union(x,y);
            
        if(cod == 2)
        {
            if(Find(x) == Find(y)) 
                fout<<"DA\n";
            else fout<<"NU\n";
        }
    }

    return 0;
}