Cod sursa(job #1244570)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 17 octombrie 2014 20:04:40
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream>

using namespace std;

ifstream fin( "disjoint.in" );
ofstream fout( "disjoint.out" );

const int nmax = 100000;
int tata[ nmax + 1 ], grad[ nmax + 1 ];

int find_tata( int x ) {
    if ( tata[ x ] == x ) {
        return x;
    } else {
        return ( tata[ x ] = find_tata( tata[ x ] ) );
    }
}
int main() {
    int n, m, a, b, t, ta, tb;
    fin >> n >> m;
    for( int i = 1; i <= n; ++ i ) {
        tata[ i ] = i;
        grad[ i ] = 1;
    }
    for( ; m > 0; -- m ) {
        fin >> t >> a >> b;
        ta = find_tata( a );
        tb = find_tata( b );
        if ( t == 1 ) {
            if ( grad[ ta ] < grad[ tb ] ) {
                grad[ tb ] += grad[ ta ];
                tata[ ta ] = tb;
            } else {
                grad[ ta ] += grad[ tb ];
                tata[ tb ] = ta;
            }
        } else {
            if ( ta == tb ) {
                fout << "DA\n";
            } else {
                fout << "NU\n";
            }
        }
    }
    fin.close();
    fout.close();
    return 0;
}