Cod sursa(job #2948003)

Utilizator CosminaBuruianaCosmina Buruiana CosminaBuruiana Data 27 noiembrie 2022 01:55:51
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;


ifstream f("disjoint.in");
ofstream g("disjoint.out");

vector<int> parinte;
vector<int> grad;


//funtie pentru gasirea radacinii
int find_father(int x)
{

    if(parinte[x]==x)
    return x;

    return find_father(parinte[x]);


}
int main()
{
    int n,m,op,x,y;
    f>>n>>m;
    parinte.resize(n+1);
    grad.resize(n+1);
    for(int i=1; i<=n;i++)
    {
        parinte[i]=i;
        grad[i]+=1;
    }
    for(int i=1;i<=m;i++)
    {
        f>>op>>x>>y;
        if(op==1)
        {

          //unim cei 2 arbori. Arborele cu grad mai mic va fi alipit la cel cu grad mai mare.
           if(grad[find_father(x)]<grad[find_father(y)])
           {
                grad[find_father(y)]+=grad[find_father(x)];
                //modificam radacina arborelui mai mic, care o va prelua pe cea a arborelui mare
                parinte[find_father(x)]=find_father(y);
           }

           else
           {

               grad[find_father(x)]+=grad[find_father(y)];
               parinte[find_father(y)]=find_father(x);

           }
        }

        if(op==2)
        {
            //verificam daca ambii arbori au aceeasi radacina
            if(find_father(x)==find_father(y))
                g<<"DA\n";
            else
                g<<"NU\n";
        }
    }




    return 0;
}