Cod sursa(job #2696774)

Utilizator emma.chirlomezEmma Chirlomez emma.chirlomez Data 16 ianuarie 2021 16:43:57
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include<bits/stdc++.h>
using namespace std;

const int NMAX = 100100;
int sef[NMAX];

// initializeaza vecotorul de sefi
void Init(int n)
{
    for (int i = 0; i< n; i++)
        sef[i] = i;
}

// Gaseste seful suprem al nodului
int Find(int nod)
{
    while(sef[nod] != nod)
        nod = sef[nod];
    return nod;

    // OR
    if (sef[nod] == nod)
        return nod;
    return Find(sef[nod]);
}

// Returneaza false daca cele doua noduri sunt deja unite 
// Returneaza true si le uneste daca nu
bool Unite(int a, int b)
{
    a = Find(a);
    b = Find(b);
    if (a == b)
        return false;
    sef[a] = b;
    return true;
}

int main()
{
    ifstream cin("disjoint.in");
    ofstream cout("disjoint.out");
    int n, m;
    cin >> n >> m;

    Init(n + 1);

    for(int i = 0; i < m; i++) {
        int op, a, b;
        cin >> op >> a >> b;
        if (op == 1) {
            Unite(a, b);
        }
        else {
            a = Find(a);
            b = Find(b);
            if (a == b)
                cout << "DA\n";
            else
                cout << "NU\n";
        }   
    }

    return 0;
}