Cod sursa(job #2531155)

Utilizator Tudor06MusatTudor Tudor06 Data 25 ianuarie 2020 19:13:30
Problema Paduri de multimi disjuncte Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define NMAX 100000

int father[NMAX + 1];

int root( int i ) {
    if ( father[i] == i )
        return i;
    return father[i] = root( father[i] );
}
void unire( int i, int j ) {
    father[root( j )] = root( i );
}

FILE *fin, *fout;

int numar() {
    char ch;
    int nr = 0;
    while ( isspace( ch = fgetc( fin ) ) );
    do {
        nr = nr * 10 + ch - '0';
    } while ( isdigit( ch = fgetc( fin ) ) );
    return nr;
}

int main() {
    fin = fopen( "disjoint.in", "r" );
    fout = fopen( "disjoint.out", "w" );
    int n, m, i, nod1, nod2;
    char cer;
    n = numar();
    m = numar();
    for ( i = 1; i <= n; i ++ ) {
        father[i] = i;
    }
    for ( i = 0; i < m; i ++ ) {
        cer = numar();
        nod1 = numar();
        nod2 = numar();
        switch ( cer ) {
        case 1:
            unire( nod1, nod2 );
            break;
        case 2:
            if ( root( nod1 ) == root( nod2 ) )
                fprintf( fout, "DA\n" );
            else
                fprintf( fout, "NU\n" );
            break;
        }
    }
    fclose( fin );
    fclose( fout );
    return 0;
}