Cod sursa(job #2254606)

Utilizator SemetgTemes George Semetg Data 5 octombrie 2018 17:04:05
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
using namespace std;

#define N_MAX 100005

ifstream in { "disjoint.in" };
ofstream out { "disjoint.out" };

int t[N_MAX], rang[N_MAX];

int gaseste(int nod) {
    int radacina;
    for (radacina = nod; t[radacina] != radacina; radacina = t[radacina]);
    
    for (int f; t[nod] != nod; nod = f) {
        f = t[nod];
        t[nod] = radacina;
    }
    
    return radacina;
}

void uneste(int x, int y) {
    if (rang[x] > rang[y]) {
        rang[x] += rang[y];
        t[y] = x;
    } else {
        rang[y] += rang[x];
        t[x] = y;
    }
}

int main() {
    int n, m;
    in >> n >> m;
    
    for (int i { 1 }; i <= n; ++i) {
        t[i] = i;
        rang[i] = 1;
    }
    
    while (m--) {
        int cod, x, y;
        in >> cod >> x >> y;
        
        int rad1 { gaseste(x) }, rad2 { gaseste(y) };
        if (cod == 1)
            uneste(rad1, rad2);
        else
            out << (rad1 == rad2 ? "DA\n" : "NU\n");
    }
}