Cod sursa(job #1957117)

Utilizator MaligMamaliga cu smantana Malig Data 7 aprilie 2017 12:44:47
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");

const int NMax = 1e5 + 5;

int T,N,M;
int dad[NMax],nrSub[NMax];

int findRoot(int);
void unite(int,int);

int main() {
    in>>N>>M;

    for (int i=1;i<=N;++i) {
        dad[i] = i;
        nrSub[i] = 1;
    }

    while (M--) {
        int tip,a,b;
        in>>tip>>a>>b;
        if (tip == 1) {
            unite(findRoot(a),findRoot(b));
        }
        else {
            if (findRoot(a) == findRoot(b)) {
                out<<"DA\n";
            }
            else {
                out<<"NU\n";
            }
         }
    }

    in.close();out.close();
    return 0;
}

int findRoot(int nod) {
    if (dad[nod] == nod) {
        return nod;
    }
    dad[nod] = findRoot(dad[nod]);
    return dad[nod];
}
void unite(int r1,int r2) {
    if (nrSub[r1] > nrSub[r2]) {
        dad[r2] = r1;
        nrSub[r1] += nrSub[r2];
    }
    else {
        dad[r1] = r2;
        nrSub[r2] += nrSub[r1];
    }
}