Cod sursa(job #2681441)

Utilizator mariusn01Marius Nicoli mariusn01 Data 5 decembrie 2020 14:48:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <bitset>
#define CIUR 1001000

using namespace std;

ifstream fin  ("disjoint.in");
ofstream fout ("disjoint.out");
int t[100010];
int a, b, ra, rb, n, m, i, tip;

int rad(int x) { /// returnreaza radacina arborelui in care este nodul x
    while(t[x] > 0)
        x = t[x];
    return x;
}

int main (){
    fin>>n>>m;
    for (i=1;i<=n;i++)
        t[i] = -1;
    while (m--) {
        fin>>tip>>a>>b;
        ra = rad(a);
        rb = rad(b);

        /// daca la unire pastrez mereu ca radacina
        /// pe cea a arborelui cu mai multe noduri
        /// este demonstrat ca mereu inaltimea
        /// ramane de ordin log n
        if (tip == 1) {
            if (ra != rb) {

                if (-t[ra] > -t[rb]) {
                    /// a ramane radacina
                    t[ra] += t[rb];
                    t[rb] = ra;
                } else {
                    t[rb] += t[ra];
                    t[ra] = rb;
                }
            }
        } else {
            if (ra == rb)
                fout<<"DA\n";
            else
                fout<<"NU\n";
        }

    }
    return 0;
}