Cod sursa(job #1330147)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 30 ianuarie 2015 14:13:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
#define MAXN 100005
FILE *f=fopen("disjoint.in","r"), *g=fopen("disjoint.out","w");

long int N, M, Tata[MAXN], Inaltime[MAXN], Q, X, Y; // Inaltime[i] = la ce inaltime se afla i

long int Grupa( long int x ){
long int R, RR, RRvechi;

    R=x;
    while( Tata[R]!=0 ) R = Tata[R];
    RR=x;
    while( Tata[RR]!=0 ) { RRvechi = RR; RR=Tata[RR]; Tata[RRvechi]=R;  }

    return R;
}

void Uneste(long int x, long int y){

    x = Grupa(x); y = Grupa(y); // Unim varfurile grupei, nu pe x cu y

    if     ( Inaltime[x] > Inaltime[y] ) Tata[y]=x;
    else if( Inaltime[x] < Inaltime[y] ) Tata[x]=y;
    else{ Tata[x]=y; Inaltime[y]++; } // Egalitate

}

int main(){

    fscanf(f,"%ld %ld\n",&N,&M);
    for(long int i=1;i<=M;i++){

        fscanf(f,"%ld %ld %ld\n",&Q,&X,&Y);
        if(Q==1) Uneste(X,Y);
        else{
            if( Grupa(X) == Grupa(Y) ) {fprintf(g,"DA\n");}
            else fprintf(g,"NU\n");
        }

    }

return 0;
}