Cod sursa(job #715351)

Utilizator ILDottoreBogdan Stoian ILDottore Data 17 martie 2012 01:07:23
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<cstdio>
using namespace std;

#define NMAX 100010


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

long n,m,T[NMAX],op,x,y,R[NMAX];


long multime (long i)
{
	long root=i,aux;
	
	while (T[root]!=root)
	 root=T[root];

	while (T[i]!=i)
	{ aux=T[i];
	  T[i]=root;
	  i=aux;
	}
	
	return root;
}


void reuneste (long i, long j)

{    i=multime(i);
	 j=multime(j);
	 
	 if (i==j) return;
	 
	 if (R[i]<R[j])
		 T[i]=T[j];
	 else
		 T[j]=T[i];
	 
	 if ( R[i]==R[j] )
		 R[i]++;
}
     
	 

int main()
{
	fscanf(f,"%ld%ld",&n,&m);
	
	for (long i=1;i<=n;i++)
		T[i]=i;
	
	
	for (long i=1;i<=m;i++)
	 { fscanf(f,"%ld%ld%ld",&op,&x,&y);
	
	if (op==1)
	    reuneste(x,y);
	if (op==2)
	   if (multime(x)==multime(y))
		   fprintf(g,"DA\n");
	   else
		   fprintf(g,"NU\n");
	   
}
	
return 0;}