Cod sursa(job #1789535)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 27 octombrie 2016 09:16:51
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#define NMAX 100000
using namespace std;
int sef[NMAX+1];
int card;
int find ( int nr ) {
    card = 0;
    int aux = nr, ras;
    while ( sef[aux] != aux )
        aux = sef[aux];
    ras = aux;
    while ( sef[nr] != nr ) {
        aux = sef[nr];
        sef[nr] = ras;
        nr = aux;
        ++card;
    }
    return ras;
}
int uneste ( int x, int y ) {
    int sefx, sefy, cardx, cardy;
    sefx = find ( x );
    cardx = card;
    sefy = find ( y );
    cardy = card;
    if ( cardx < cardy )
        sef[sefx] = sefy;
    else
        sef[sefy] = sefx;
}
int main() {
    freopen ( "disjoint.in", "r", stdin );
    freopen ( "disjoint.out", "w", stdout );
    int n, m, x, y, cod, i;
    scanf ( "%d%d",&n, &m );
    for ( i = 1 ; i <= n ; i ++ )
        sef[i] = i;
    for ( i = 1 ; i <= m ; i ++ ) {
        scanf ( "%d%d%d",&cod, &x, &y );
        if ( cod == 1 )
            uneste ( x, y );
        else {
            if ( find ( x ) == find ( y ) )
                printf ( "DA\n" );
            else
                printf ( "NU\n" );
        }
    }
    return 0;
}