Cod sursa(job #1824172)

Utilizator mdiannnaMarusic Diana mdiannna Data 7 decembrie 2016 14:38:00
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>
#include <stdio.h>

using namespace std;
int N, M;

int r[100001];
int dim[100001];

void init(){
    for(int i=1; i<=N; i++){
        r[i] = i;
        dim[i] = 1;
    }
}

int gaseste_radacina(int x){
    while(r[x] != x){
        x = r[x];
    }
    return x;
}

void join(int x, int y){
    int i, j;
    x = gaseste_radacina(x);
    y = gaseste_radacina(y);

    dim[x] > dim[y] ? i=x, j=y: i=y; j=x;
    r[j] = i;

    if(dim[i] == dim[j])
        dim[j]++;


}

void aceeasi_multime(int x, int y){
    if(gaseste_radacina(x) == gaseste_radacina(y))
        printf("DA\n");
    else
        printf("NU\n");
}

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

    int op, x, y;

    scanf("%d %d", &N, &M);
    init();
    for(int i=0; i<M; i++){
        scanf("%d %d %d", &op, &x, &y);
        if(op == 1)
            join(x, y);
        else
            aceeasi_multime(x, y);
    }

    return 0;
}