Cod sursa(job #1732128)

Utilizator serbanmaria15Serban Maria-Catalina serbanmaria15 Data 20 iulie 2016 21:03:57
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include<stdio.h>
#define max 100001

int legaturi[max], rang[max];
int n,m;

int cautRadacina(int x)
{
	int radacina, y;
	//parcurg arborele in sus pana ajungem la un nod care nu mai are legatura in sus => el e radacina
	for(radacina = x; legaturi[radacina] != radacina; radacina = legaturi[radacina]) {} //{} = nu fac nimic, doar parcurgere

	//cand ies din for, ie am gasit radacina aplic euristica compresiei drumurilor
	//ie: toate nodurile de la x la radacina le leg direct de radacina
	for( ; legaturi[x] != x; ) //am doar conditie de continuare, care asigura si iesirea din for
	{
		y=legaturi[x];
		legaturi[x]=radacina;
		x=y;
	}

	return radacina;
}

void reunesc(int x, int y)
{
	//aplic euristica rangului
	//ie: leg arborele cu inaltime mai mica de cel cu inaltime mai mare
	if( rang[x] > rang[y] )
	{
		legaturi[y]=x;
	}
	else
	{
		legaturi[x]=y;
	}
	//daca au aceeasi inaltime cresc rangul cu 1
	if( rang[x] == rang[y] )
		rang[y] = rang[y] + 1;
}

int main()
{
	FILE *inputFile, *outputFile;
	inputFile=fopen("disjoint.in", "r");
	outputFile=fopen("disjoint.out", "w");

	int x, y, operatie, i;
	
	fscanf(inputFile,"%d %d", &n, &m);

	//intial fiecare nod reprezinta un arbore
	//deci intializam legaturi si rang corespunzator
	for(i=1; i<=n; i++)
	{
		legaturi[i]=i;
		rang[i]=0;
	}

	for(i=1; i<=m; i++)
	{
		fscanf(inputFile, "%d %d %d", &operatie, &x, &y);
		if(operatie == 2)
		{
			//verific daca arborii in care se afla x, respectov y au aceeasi radacina
			if(cautRadacina(x) == cautRadacina(y))
			{
				fprintf(outputFile,"DA\n");
			}
			else
			{
				fprintf(outputFile,"NU\n");
			}
		}
		else //unesc cei doi arbori
		{
			reunesc(x,y);
		}
	}

		return 0;
	}