Cod sursa(job #545483)

Utilizator BitOneSAlexandru BitOne Data 3 martie 2011 14:12:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 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 ); }
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 Rank( int x, int y )
{
	if( r[x] == r[y] )
	{
		if( x != y )
			f[y]=x;
		++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;
		if( 1 == i )
			Rank( find(j), find(k) );
		else if( find(j) == find(k) )
				out<<"DA\n";
			 else out<<"NU\n";
	}
	return EXIT_SUCCESS;
}