Cod sursa(job #1627235)

Utilizator IgorDodonIgor Dodon IgorDodon Data 3 martie 2016 15:36:37
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<stdio.h>
#include<algorithm>
#define DIM 100005
FILE *f=fopen("disjoint.in","r"), *g=fopen("disjoint.out","w");

using namespace std;

int N, M, T[DIM], H[DIM], A, B, C;   // T = tatii, H = inaltimile

void Uneste( int x, int y ){
int Tx, Ty;

    Tx = x;
    while( T[Tx] != 0 )
        Tx = T[Tx];

    Ty = y;
    while( T[Ty] != 0 )
        Ty = T[Ty];

    if( H[Tx] >= H[Ty] ){   // Lipim Ty la Tx

        T[Ty] = Tx;
        if( H[Tx] == H[Ty] )    // Cand au inaltimi egale, lipind h se mareste cu 1
            H[Tx]++;

    }
    else   // Lipim Tx la Ty
        T[Tx] = Ty;

}

void Intreaba( int x, int y ){
int Tx, Ty, newTx, newTy;

    Tx = x;
    while( T[Tx] != 0 )
        Tx = T[Tx];

    Ty = y;
    while( T[Ty] != 0 )
        Ty = T[Ty];

    if( Tx == Ty )
        fprintf(g,"DA\n");
    else
        fprintf(g,"NU\n");

    // EURISTICA 2
    newTx = Tx;
    newTy = Ty;

    Tx = x;
    while( T[Tx] != 0 ){
        T[Tx] = newTx;
        Tx = T[Tx];
    }
    H[newTx] = 1;

    Ty = y;
    while( T[Ty] != 0 ){
        T[Ty] = newTy;
        Ty = T[Ty];
    }
    H[newTy] = 1;

}

int main(){

    fscanf(f,"%d %d\n",&N,&M);

    for(int i=1;i<=M;i++){

        fscanf(f,"%d %d %d\n",&A,&B,&C);

        if( A == 1 )
            Uneste(B,C);
        else
            Intreaba(B,C);

    }

return 0;
}