Cod sursa(job #902902)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 1 martie 2013 17:23:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>
using namespace std;

#define Nmax 100010

int n, m, rang[Nmax], rad[Nmax];

int find(int x){
    int r = x, aux;

    while( rad[r] != r ) r = rad[r];
    while(x != r){
        aux = rad[x];
        rad[x] = r;
        x = aux;
    }

    return r;
}

void unite(int x, int y){
    if( rang[x] > rang[y] )
        rad[y] = x;
        else rad[x] = y;
    if(rang[x] == rang[y]) ++rang[y];
}

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

    int x, y, cod;

    scanf("%i %i", &n, &m);

    for(int i = 1; i <= n; ++i){
        rang[i] = 1;
        rad[i] = i;
    }

    for(int i = 1; i <= m; ++i){
        scanf("%i %i %i", &cod, &x, &y);

        if(cod == 2){
            if( find(x) == find(y) ) printf("DA\n");
                else printf("NU\n");
        }
        else
            unite( find(x), find(y) );
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}