Cod sursa(job #580228)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 12 aprilie 2011 20:45:15
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<stdio.h>

#define maxN 100005

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

int n,m,op,x,y,i,aux;
int T[maxN],R[maxN];

void unify ( int a, int b ){
	
	if ( R[x] > R[y] ){
		T[y] = x;
	}
	else{
		T[x] = y;
	}
	
	if ( R[x] == R[y] ){
		++R[y];
	}
	
}

int root ( int nod ){
	
	int nod2 = nod;
	
	for ( nod2 = nod ; T[nod2] != nod2 ; nod2 = T[nod2] );
	
	for ( ; nod != nod2 ; ){
		aux = T[nod];
		T[nod] = nod2;
		nod = aux;
	}
	
	return nod2;
}

int main () {
	
	fscanf(f,"%d %d",&n,&m);
	
	for ( i = 1 ; i <= n ; ++i ){
		T[i] = i;
		R[i] = 1;
	}
	
	for ( i = 1 ; i <= m ; ++i ){
		
		fscanf(f,"%d %d %d",&op,&x,&y);
		
		if ( op == 1 ){
			unify( root(x) , root(y) );
		}
		else{
			if ( root(x) == root(y) ){
				fprintf(g,"DA\n");
			}
			else{
				fprintf(g,"NU\n");
			}
		}
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}