Cod sursa(job #2412233)

Utilizator Marius92roMarius Marius92ro Data 21 aprilie 2019 20:49:24
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>

#define NMAX 100020

int vectorTati[NMAX], rang[NMAX];
int nrNoduri, nrCoduri;

int radacina(int nod){

	int radacinaNod, aux;

	for (radacinaNod = nod; vectorTati[radacinaNod] != radacinaNod; radacinaNod = vectorTati[radacinaNod]);

	for (; vectorTati[nod] != nod;)
	{
		aux = vectorTati[nod];
		vectorTati[nod] = radacinaNod;
		nod = aux;
	}
	return radacinaNod;
}


void unire(int radacinaX, int radacinaY){

	if (rang[radacinaX] > rang[radacinaY])
		vectorTati[radacinaY] = radacinaX;
    else
        vectorTati[radacinaX] = radacinaY;

	if (rang[radacinaX] == rang[radacinaY])
                                rang[radacinaY]++;
}

int main(){

	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);

	scanf("%d %d ", &nrNoduri, &nrCoduri);

	int  x, y, cod;

	for (int i = 1; i <= nrNoduri; i++)
	{
		vectorTati[i] = i;
		rang[i] = 1;
	}

	for (int i = 1; i <= nrCoduri; i++)
	{
		scanf("%d %d %d", &cod, &x, &y);

		if (cod == 2){

			if (radacina(x) == radacina(y)) printf("DA\n");
				else printf("NU\n");
		}
			else
				{

					unire(radacina(x), radacina(y));
				}
	}

	return 0;
}