Cod sursa(job #2807430)

Utilizator atudoreimirunaAtudorei Miruna Gabriela atudoreimiruna Data 23 noiembrie 2021 19:50:44
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <tuple>
#include <list>
#include <algorithm>
 
#define Nmax 100001
 
using namespace std;
 
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
 
int N, M;
int parinte[Nmax], inaltime[Nmax];
 
class Graf{
private:
    int Nr_Noduri, Nr_Muchii;
    vector<int> GRAF[Nmax]; // lista de adiacenta
 
public:
    Graf(int N, int M); // constructor
    int Gasire_Radacina(int nod);
    void Unire_Radacini(int nod1, int nod2);
    void Disjoint();
};
 
// constructor
Graf :: Graf(int N, int M)
{
    Nr_Noduri = N;
    Nr_Muchii = M;
}
 
// gaseste radacina arborelui la care apartine nodul
int Graf :: Gasire_Radacina(int nod)
{
    if ( nod != parinte[nod] )
    {
        parinte[nod] = Gasire_Radacina(parinte[nod]);
        return parinte[nod];
    }
    return nod;
}
 
void Graf :: Unire_Radacini(int nod1, int nod2)
{
    int rad_nod1 = Gasire_Radacina(nod1);
    int rad_nod2 = Gasire_Radacina(nod2);
 
    if ( rad_nod1 != rad_nod2 )
    {
        if ( inaltime[rad_nod1] > inaltime[rad_nod2] )
            parinte[rad_nod2] = rad_nod1;
        else
        {
            parinte[rad_nod1] = rad_nod2;
            if ( inaltime[rad_nod1] == inaltime[rad_nod2] )
                inaltime[rad_nod2] ++;
        }
    }
}
 
void Graf :: Disjoint()
{
    for ( int i = 1; i <= Nr_Noduri; i++ ) // fiecare nod este propriul sau parinte
        parinte[i] = i;
 
    for ( int i = 1; i <= Nr_Muchii; i++ )
    {
        int op, x, y;
        fin >> op >> x >> y;
 
        if ( op == 1 ) // reunim multimile nodurilor x si y
            Unire_Radacini(x,y);
        else
        {
            int a = Gasire_Radacina(x);  // daca nodurile x si y au aceeasi radacina atunci sunt din aceeasi multime
            int b = Gasire_Radacina(y);
            if ( a == b )
                fout << "DA\n";
            else
                fout << "NU\n";
        }
    }
}
 
int main()
{
    fin >> N >> M;
    Graf G(N, M);
    G.Disjoint();
 
    return 0;
}