Cod sursa(job #2807413)

Utilizator AndreeaCreitaCreita Andreea AndreeaCreita Data 23 noiembrie 2021 19:16:23
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int par[100005];   // vector pentru parinti
int dim[100005];  //cat de multe noduri sunt in arborele respectiv
int find_radacina(int x)
{
    vector <int> met;
    while(x!=par[x])  //parcurgem cat timp x are parinte
       {
            x=par[x];
            met.push_back(x);
       }
    for(auto el:met)
    {
        par[el] = x;
    }
    return x;
}

void unite(int a, int b)
{
    int x = find_radacina(a);
    int y = find_radacina(b);
    if(dim[x] > dim[y])         //unim arborele mai mic de arborele mai mare
    {
        par[y] = x;
        dim[x]+=dim[y];
    }
    else
    {
        par[x] = y;
        dim[y] += dim[x];
    }

}
/*
void init()
{
    int n;
    for(int i=1; i<=n; ++i)
    {
        par[i]=i;
        dim[i]=1;
    }
} */
int main()
{
    int n, m;
    fin>> n >> m;

    for(int i=1; i<=n; i++)
    {
        par[i] = i;
    }

    while (m--)
    {
        int cod, a, b;
        fin>> cod >> a >> b;
        if(cod == 1)
        {
            unite(a,b);
        }
        else
        {
            if(find_radacina(a) == find_radacina(b))
                fout << "DA\n";

            else
                fout << "NU\n";
        }
    }
    return 0;
}