Cod sursa(job #2643908)

Utilizator LeCapataIustinian Serban LeCapata Data 22 august 2020 11:24:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#define N 100020

 using namespace std;

ifstream in("disjoint.in");
ofstream out("disjoint.out");

int conect[N], rankArbore[N];
int n, m;

int cauta(int x)
{
	int radacina, y;

	//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
	radacina = x;
	while(conect[radacina] != radacina)
        radacina = conect[radacina];

	//aplic compresia drumurilor
	while(conect[x] != x){
		y = conect[x];
		conect[x] = radacina;
		x = y;
	}
	return radacina;
}

void uneste(int x, int y)
{
	//unesc multimea cu rang mai mic de cea cu rang mai mare
	if (rankArbore[x] > rankArbore[y]) conect[y] = x;
    else conect[x] = y;

	//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
	if (rankArbore[x] == rankArbore[y]) rankArbore[y]++;
}

int main()
{
	in>>n>>m;

	//initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
	for(int i = 1; i <= n; ++i){
		conect[i] = i;
		rankArbore[i] = 1;
	}

	for(int i = 1; i <= m; ++i){
        int com, x, y;
		in>>com>>x>>y;

		if(com == 2){
			//verific daca radacina arborilor in care se afla x respectiv y este egala
			if(cauta(x) == cauta(y)) out<<"DA\n";
				else out<<"NU\n";
		}
        else{
            //unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
            if(cauta(x) == cauta(y)) return 0;
            uneste(cauta(x), cauta(y));
        }
	}
	return 0;
}