Cod sursa(job #2525978)

Utilizator TedystTedy Stoica Tedyst Data 18 ianuarie 2020 09:54:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
using namespace std;
#define NMAX 100001
int tati[NMAX];
int h[NMAX];
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
int Find(int x) {
    int rad=x;
    while(tati[rad]!=0)
        rad = tati[rad];

    // compresia
    // cand trece face fiecare nod sa aiba radacina rad => face drumul de lungime 1 data viitoare
    while(tati[x]) {
        int tx=tati[x];
        tati[x]=rad;
        x=tx;
    }

    return rad;
}
void Union(int x, int y) {
    int arx = Find(x), ary = Find(y);
    if (arx == ary) return;

    // facem inaltimea minima
    // arx este mai mic => aceeasi inaltime maxima
    // arx == ary => inaltime maxima +1
    if (h[arx] <= h[ary])
        tati[arx] = ary;
    // ary este mai mare
    else tati[ary] = arx;
}
int main() {
    int cod,b,c,n,m;
    fin>>n>>m;
    for(int i=1; i<=m; i++) {
        fin>>cod>>b>>c;
        if(cod==1)
            Union(b,c);
        else if(cod==2) {
            if(Find(b)==Find(c))
                fout<<"DA"<<'\n';
            else fout<<"NU"<<'\n';
        }
    }
    return 0;
}