Cod sursa(job #286795)

Utilizator katakunaCazacu Alexandru katakuna Data 24 martie 2009 10:32:39
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>

int tip, x, y, i, n, m, t[100111];

int tata(int x){

	int T = x;
	while( t[T] > 0 )
		T = t[T];

	return T;
}


int inclus(int x, int y){

	int t1, t2;
	t1 = tata(x);
	t2 = tata(y);
	
	if( t1 == t2 )
		return 1;
	
	return 0;	
}

void reun(int x, int y){

	int t1, t2;
	t1 = tata(x);
	t2 = tata(y);
	
	if( t1 != t2 )
		if( -t[t1] > - t[t2] ){
			t[t1]+=t[t2];
			t[t2] = t1;
		}
		
		else{
			t[t2]+=t[t1];
			t[t1] = t2;
		}

}

int main(){

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

	fscanf(f,"%d %d",&n,&m);
	for(i=1; i<=n; i++)
		t[i] = -1;
	
	for(i=1; i<=m; i++){
		fscanf(f,"%d %d %d",&tip,&x,&y);
		if( tip == 1 ) reun(x, y);
		else
			if( inclus(x,y) )
				fprintf(g,"DA\n");
			else
				fprintf(g,"NU\n");
	}
	
	fclose(f);
	fclose(g);
	
}