Cod sursa(job #1551742)

Utilizator Burbon13Burbon13 Burbon13 Data 16 decembrie 2015 15:40:05
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>

using namespace std;

ifstream f("disjoint.in");
ofstream o("disjoint.out");

const int nmx = 100002;

int n,m;
int tata[nmx],rang[nmx];

int grupa(int nr){
    int aux = nr, tatal = nr;
    while(tatal != tata[tatal])
        tatal = tata[tatal];
    while(nr != tata[nr]){
        aux = tata[nr];
        tata[nr] = tatal;
        nr = aux;
    }
    return tatal;
}

void uneste(int g1, int g2){
    if(rang[g1] > rang[g2])
        tata[g2] = g1;
    else
        tata[g1] = g2;
    if(rang[g1] == rang[g2])
        ++ rang[g2];
}

int main(){
    f >> n >> m;
    for(int i = 1; i <= n; ++i){
        tata[i] = i;
        rang[i] = 1;
    }
    int n1,n2,op,g1,g2;
    for(int i = 1; i <= m; ++i){
        f >> op >> n1 >> n2;
        g1 = grupa(n1);
            g2 = grupa(n2);
        if(op == 1){
            if(g1 != g2)
                uneste(g1,g2);
        }
        else
            o << ((g1 == g2) ? "DA\n" : "NU\n") ;

    }
    return 0;
}