Cod sursa(job #296605)

Utilizator andreisfrentSfrent Andrei andreisfrent Data 4 aprilie 2009 22:41:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>

#define N 100001
#define REUNESTE 1
#define VERIFICA 2

int n, m;
int rang[N], tata[N];

int radacina(int x)
{
	int rez = x, aux;
	
	while(tata[rez] != rez) rez = tata[rez];
	
	while(tata[x] != x)
	{
		aux = tata[x];
		tata[x] = rez;
		x = tata[x];
	}
	
	return rez;
}

void reuneste(int x, int y)
{
	if(rang[x] > rang[y]) tata[y] = x;
	else tata[x] = y;
	
	if(rang[x] == rang[y]) rang[y]++;
}

int main()
{
	FILE* fi = fopen("disjoint.in", "r");
	FILE* fo = fopen("disjoint.out", "w");
	fscanf(fi, "%d%d", &n, &m);
	int i, x, y, operatie;
	
	for(i = 1; i <= n; ++i) 
	{
		rang[i] = 1;
		tata[i] = i;
	}
	
	while(m--)
	{
		fscanf(fi, "%d%d%d", &operatie, &x, &y);
		
		if(operatie == REUNESTE) reuneste(radacina(x), radacina(y));
		
		if(operatie == VERIFICA)
		{
			if(radacina(x) == radacina(y)) fprintf(fo, "DA\n");
			else fprintf(fo, "NU\n");
		}
	}
	
	fclose(fi);
	fclose(fo);
}