Cod sursa(job #743977)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 6 mai 2012 21:36:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 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

void MakeSet(int x)
{
	T[x]=x;
	Rang[x]=1;
}

void Link(int x,int y)
{
	if( Rang[x] > Rang[y] )
		T[y] = x;
	else
		if( Rang[x] < Rang[y] )
			T[x] = y;
		else
			if(Rang[x] == Rang[y] )
			{
				T[x] = y;
				Rang[y]++;
			}
}

int FindRoot(int x)
{
	int i,a;
	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)
	{
		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);
}