Cod sursa(job #2805415)

Utilizator andreinovaNacu Andrei Emilian andreinova Data 21 noiembrie 2021 14:35:14
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAX = 100001;

class Graf
{
    int NrNoduri;

public:

    Graf(int NrNoduri);
    int gaseste(int nod, int v[MAX]);
    int uneste(int nod1, int nod2, int v[MAX], int inaltime[MAX]);
};

Graf::Graf(int NrNoduri)
{
    this->NrNoduri = NrNoduri;
}

int Graf::gaseste(int nod, int v[MAX])
{
    int i = nod;

    while(v[i] != i)
        i = v[i];

    while(v[nod] != nod)
    {
        int aux = v[nod];
        v[nod] = i;
        nod = aux;
    }

    return i;
}

int Graf::uneste(int nod1, int nod2, int v[MAX], int inaltime[MAX])
{
    if(inaltime[nod1] > inaltime[nod2])
        v[nod2] = nod1;
    else
        v[nod1] = nod2;

    if(inaltime[nod1] == inaltime[nod2])
        inaltime[nod2]++;
}


int main()
{
    int nod1, nod2, operatie, v[MAX], inaltime[MAX] = {1};

    int N, M;
    in >> N >> M;

    for(int i = 0; i < N; i++)
        v[i] = i;

    Graf g(N);
    for(int i = 0; i < M; i++)
    {
        in >> operatie >> nod1 >> nod2;

        if(operatie == 2)
            if(g.gaseste(nod1, v) == g.gaseste(nod2, v))
                out << "DA\n";
            else
                out << "NU\n";

        else
            g.uneste(g.gaseste(nod1, v), g.gaseste(nod2, v), v, inaltime);
    }

    return 0;
}