Cod sursa(job #2412234)

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

#define NMAX 100020

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

int radacina(int nod){

    int radacinaNod = nod;

    while ( vectorTati[radacinaNod] != radacinaNod ) //caut radacina nodului
            radacinaNod = vectorTati[radacinaNod];

    while ( vectorTati[nod] != nod ){ //actualizez vectorul de tati cu radacina gasita
         int aux = vectorTati[nod];
         vectorTati[nod] = radacinaNod;
         nod = aux;
    }

    return radacinaNod;

}

void unire(int x, int y){ //leg radacinile a  doua componente conexe

    int radacinaX = radacina(x);
    int radacinaY = radacina(y);

    if ( radacinaX != radacinaY ){ //in caz ca radacinile sunt diferite -> avem doua submultimi ( componente conexe ) diferite

            if(rang[radacinaX] > rang[radacinaY]){  //unesc multimea cu rang mai mic de cea cu rang mai mare
                        vectorTati[radacinaY] = radacinaX;

            }

            else{
                vectorTati[radacinaX] = radacinaY;

            }


            if( rang[radacinaX] == rang[radacinaY] ) //in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
                                    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(x,y);
				}
	}

	return 0;
}