Cod sursa(job #1047430)

Utilizator Tux2NicolaeTelechi Nicolae Tux2Nicolae Data 4 decembrie 2013 13:40:30
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<stdio.h>
#include<string.h>

const int dim=1000002;
int tata[dim];

inline int abs(int a){ return a<0?-a:a; }

void init(int N){
    memset(tata+1,-1,sizeof(int)*N);
}

int find(int x){
    int it,temp,radacina=x;
    while(tata[radacina]>=0){
        radacina=tata[radacina];
    }
    //Compresion
    it=x;
    while(tata[it]>=0){
        temp=it;
        it=tata[it];
        tata[temp]=radacina;
    }

    return radacina;
}

void merge(int x,int y){
    int tatax,tatay;
    tatax=find(x);
    tatay=find(y);

    if(tata[tatax]<=tata[tatay]){
        tata[tatay]=tatax;
        if(tata[tatax]==tata[tatay])
            tata[tatax]++;
    }else{
        tata[tatax]=tatay;
    }
}

int main(){
    int N,M,op,x,y;

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

    scanf("%d %d",&N,&M);
    init(N);
    for(int i=0;i<M;i++){
        scanf("%d %d %d",&op,&x,&y);
        switch(op){
            case 1: merge(x,y); break;
            case 2:
                if(find(x)==find(y))
                    printf("DA\n");
                else
                    printf("NU\n");
                break;
        }
    }

    return 0;
}