Cod sursa(job #615466)

Utilizator BitOneSAlexandru BitOne Data 9 octombrie 2011 19:18:47
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 100011

using namespace std;
int N;
int f[N_MAX], r[N_MAX];
int Find( int x )
{
	int y, z;
	for( y=f[x]; y != f[y]; y=f[y] );
	for( ; x != f[x]; x=z )
	{
		z=f[x];
		f[x]=y;
	}
	return y;	
}
inline void Union( int x, int y )
{
	if( r[x] == r[y] )
	{
		if( x != y )
			f[y]=x;
		++r[y];
	}
	else r[x]=r[y]=r[x] <= r[y] ? r[x] : r[y];
}
int main( void )
{
	int N, M, i, op, x, y;
	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>>op>>x>>y;
		if( 1 == op )
			Union( Find(x), Find(y) );
		else if( Find(x) == Find(y) )
				out<<"DA\n";
			 else out<<"NU\n";
	}
	return EXIT_SUCCESS;
}