Cod sursa(job #743992)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 6 mai 2012 21:59:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include<cstdio>

using namespace std;

const int Nmax = 100001;

int T[Nmax],Rang[Nmax];              // T[x] reprezinta tatal nodului x   ,   Rang[x] reprezinta rangul nodului x
                                   // rangul unui varf reprezinta distanta pana la cea mai departata frunza,adica numarul de muchii de la acel varf pana la cea mai departata frunza
void MakeSet(int x)
{
	T[x]=x;
	Rang[x]=1;
}

void Link(int x,int y)
{
	if( Rang[x] > Rang[y] ) 
		T[y] = x;                   // unesc multimea cu rang mai mic de multimea cu rang mai mare,adica tatal radacinii multimii mai mici va fi radacina multimii cu rang mai mare
	else
		if( Rang[x] < Rang[y] )
			T[x] = y;
		else
			if(Rang[x] == Rang[y] )
			{
				T[x] = y;
				Rang[y]++;        // daca au acelasi rang,maresc rangul varfului care devine radacina noului arbore cu 1 
			}
}

int FindRoot(int x)
{
	int i,a;          // urc in arbore pana ajung la radacina,adica pana cand T[i]=i,adica tatal nodului i este nodul i
	for(i=x;T[i]!=i;i=T[i]) // cand se termina for-ul,i o sa reprezinta radacina/reprezentantul arborelui/multimii/set-ului care-l contine pe x
		;
	/*while(T[x]!=x)                   // path compresion  , compresia drumuriloe
	{
		a=T[x];
		T[x]=i;
		x=a;
	}*/
	return i;             // returneaza radacina/reprezentantul arborelui/multimii/set-ului care-l contine pe x
}

void Union(int x,int y)
{
	Link(FindRoot(x),FindRoot(y));
}

int main()
{
	int n,m,i,operation,x,y;
	FILE *in,*out;
	in=fopen("disjoint.in","r");
	out=fopen("disjoint.out","w");
	fscanf(in,"%d %d",&n,&m);
	for( i = 1 ; i <= n ; i++ )
		MakeSet(i);
	for( i = 1 ; i <= m ; i++ )
	{
		fscanf(in,"%d %d %d",&operation,&x,&y);
		if( operation == 1 )
			Union(x,y);
		else
			if( operation == 2 )
				if( FindRoot(x) == FindRoot(y) )
					fprintf(out,"DA\n");
				else
					fprintf(out,"NU\n");
	}
	fclose(in);
	fclose(out);
}