Cod sursa(job #2696778)

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

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

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

// Gaseste seful suprem al nodului
int Find(int nod)
{
    if (sef[nod] != nod)
        sef[nod] = Find(sef[nod]);
    return 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;
    
    if (g[a] > g[b])
        swap(a, b);

    sef[a] = b;
    g[b] += g[a];

    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;
}