Cod sursa(job #582259)

Utilizator BitOneSAlexandru BitOne Data 15 aprilie 2011 09:41:51
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 100011

using namespace std;
int f[N_MAX], r[N_MAX];
inline int _min( int x, int y ) { return ( x <= y ? x : y ); }
inline int find( int x )
{
    int y, z;
    for( y=f[x]; y != f[y]; y=f[y] );
    for( x=f[x]; x != f[x]; x=z )
    {
        z=f[x];
        f[x]=y;
    }
    return y;
}
inline void unite( int x, int y )
{
    if( r[x] == r[y] )
    {
        if( x != y )
            f[x]=y;
        ++r[y];
    }
    else r[x]=r[y]=_min( r[x], r[y] );
}
int main( void )
{
    int N, M, i, j, k;
    ifstream in( "disjoint.in" );
    ofstream out( "disjoint.out" );
    in>>N>>M;
    for( i=1; i <= N; ++i )
        f[i]=i, r[i]=1;
    for( ; M; --M )
    {
        in>>i>>j>>k;
        switch(i)
        {
            case 1 : unite( find(j), find(k) ); break;
            case 2 : out<<( find(j) == find(k) ? "DA\n" : "NU\n" );
        }
    }
    return EXIT_SUCCESS;
}