Cod sursa(job #1660731)

Utilizator Kzsolty96SAPIENTIA OSZTIAN DANIEL KUCSVAN Kzsolty96 Data 23 martie 2016 13:11:28
Problema Paduri de multimi disjuncte Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>
#include <stdlib.h>

int find(int *, int);
void unite(int *, int *, int, int);

int main(){
    int n, m, c, x, y, *t, *r, i;
    freopen("disjoint.in","r", stdin);
    freopen("disjoint.out","w", stdout);
    scanf("%i%i",&n,&m);
    t = (int *) malloc((n + 1) * sizeof(int));
    r = (int *) malloc((n + 1) * sizeof(int));
    for(i = 1; i <= n; ++i){
        t[i] = i;
        r[i] = 1;
    }
    while(m){
        scanf("%i %i %i", &c, &x, &y);
        if(c == 2){
            if(find(t, x) == find(t, y)){
                printf("DA\n");
            }
            else{
                printf("NU\n");
            }
        }
        else{
            if (find(t, x) == find(t, y))  {fprintf(stderr,"%d ", i);return 0;}
            unite(t, r, x, y);
        }
        --m;
    }
    return 0;
}

int find(int *t, int x){
    int tx = x, y;
    while(t[tx] != tx){
        tx = t[tx];
    }
    while(t[x] != x){
        y = t[x];
        t[x] = tx;
        x = y;
    }
    return tx;
}

void unite(int *t, int *r, int x, int y){
    if(r[x] < r[y]){
        t[x] = y;
    }
    else{
        t[y] = x;
    }
    if(r[x] == r[y]){
        r[y]++;
    }

}