Cod sursa(job #1563015)

Utilizator Burbon13Burbon13 Burbon13 Data 5 ianuarie 2016 17:21:58
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>

using namespace std;

const int nmx = 100002;

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

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

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

int main() {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);

    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n ; ++i) {
        rang[i] = 1;
        tata[i] = i;
    }

    int cond,a,b,g1,g2;
    for(int i = 1; i <= m; ++i){
        scanf("%d %d %d", &cond, &a, &b);
        g1 = grupa(a);
        g2 = grupa(b);
        if(cond == 1)
            uneste(g1,g2);
        else
            printf("%s\n", g1 == g2 ? "DA" : "NU");
    }

    return 0;
}