Pagini recente » Cod sursa (job #1311751) | Cod sursa (job #3285700) | Cod sursa (job #415082) | Cod sursa (job #1241728) | Cod sursa (job #1613544)
#include <fstream>
#define NMAX 100020
using namespace std;
int N, M, c, x, y;
int TT[NMAX], RG[NMAX];
int gasesteRadacina(int nod)
{
int radacina;
//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
for(radacina = nod; TT[radacina] != radacina; radacina = TT[radacina]);
//aplic compresia drumurilor pana gasesc un nod care pointeaza catre NOD-ul nostru
for( ; TT[nod] != nod; )
{
y = TT[nod];
TT[nod] = radacina;
nod = y;
}
return radacina;
}
void uneste(int nod1, int nod2)
{
//unesc multimea cu rang mai mic de cea cu rang mai mare
if (RG[nod1] > RG[nod2])
TT[nod2] = nod1;
else TT[nod1] = nod2;
//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
if (RG[nod1] == RG[nod2]) RG[nod2]++;
}
int main()
{
ifstream in("disjoint.in");
ofstream out("disjoint.out");
in >> N >> M;
for(int i = 1; i <= N; ++i)
{
TT[1] = i; //fiecare nod pointeaza catre el insusi
RG[1] = i; // rangul fiecarui arbore este 1
}
for(int i = 1; i <= M; ++i)
{
in >> c >> x >> y;
if(c == 2)
{
// verific daca radacina arborului in care se afla x si y este egala
if(gasesteRadacina(x) == gasesteRadacina(y))
out << "DA" << "\n";
else
out << "NU" << "\n";
}
else // unesc radacinile arborolui
{
if(gasesteRadacina(x) == gasesteRadacina(y))
uneste(gasesteRadacina(x), gasesteRadacina(y));
}
}
in.close();
out.close();
return 0;
}