Cod sursa(job #584451)

Utilizator bugyBogdan Vlad bugy Data 25 aprilie 2011 16:12:35
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h>
#define dim 100005
using namespace std;

int n,m,i,x,y,t,T1,T2,a,b,tata[dim],nivel[dim];

int main()
{
	FILE *f=fopen("disjoint.in","r"), *g=fopen("disjoint.out","w");

	fscanf(f,"%d %d",&n,&m);
	
for(i=1;i<=n;i++)
	{tata[i]=i;
	nivel[i]=1;}

for(i=1;i<=m;i++)
{
	fscanf(f,"%d%d%d",&t,&x,&y);
	if(t==1)
	{
		
		a=tata[x]; b=x;
		while(a!=b)
		{
			b=a;
			a=tata[b];
		}
		T1=a;
		
		//afla tatal lui y
		a=tata[y]; b=y;
		while(a!=b)
		{
			b=a;
			a=tata[b];
		}
		T2=a;
		
		if(nivel[T1] < nivel[T2])
			tata[T1]=T2;	
		if(nivel[T2] < nivel[T1])
			tata[T2]=T1;			
		else if(nivel[T2] == nivel[T1]) {tata[T2]=T1; nivel[T1]++; }
	}
	else if(t==2)
	{
		//afla tatal lui x
		a=tata[x]; b=x;
		while(a!=b)
		{
			b=a;
			a=tata[b];
		}
		T1=a;
		
		//afla tatal lui y
		a=tata[y]; b=y;
		while(a!=b)
		{
			b=a;
			a=tata[b];
		}
		T2=a;
		if(T1==T2) fprintf(g,"DA\n");
		else fprintf(g,"NU\n");
	}
}
fclose(f);
fclose(g);


return 0;
}