Pagini recente » Cod sursa (job #1492368) | Cod sursa (job #966175) | Cod sursa (job #2628549) | Cod sursa (job #1570215) | Cod sursa (job #1732128)
#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;
}