Cod sursa(job #578009)

Utilizator mvbinfoDragos Dinca mvbinfo Data 10 aprilie 2011 21:38:06
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>
#include<string.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;
memset(nivel,1,sizeof(nivel));

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  {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;
}