Pagini recente » Cod sursa (job #546008) | Cod sursa (job #1494458) | Cod sursa (job #2527377) | Cod sursa (job #1975324) | Cod sursa (job #2566243)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
const int MaxNM = 100001;
int n, m, x, y, q;
int Tata[MaxNM];// vom retine in tata[i] nodul radacina al arborelui din care face parte nodul i
int Rang[MaxNM]; // in rang[i] retinem "rangul lui i", adica dimensiunea inaltimii arborelui cu radacina i;
int Radacina(int nod);
void Unire(int x, int y);
void Rezolva(int x, int y, int q);
int main()
{
fin >> n >> m;
while (m--)
{
fin >> q >> x >> y;
Rezolva(x, y, q);
}
}
void Rezolva(int x, int y, int q)
{
if (q == 1)
Unire(x, y);
else if (q == 2)
{
int rx = Radacina(x), ry = Radacina(y);
rx == ry ? fout << "DA\n" : fout << "NU\n";
}
}
void Unire(int x, int y)
{
int rx = Radacina(x), ry = Radacina(y);
if (rx != ry)
{
if (Rang[ry] > Rang[rx]) //salvam ca radacina nodul care face parte din arborele mai mare
{
Tata[rx] = ry;
}
else
{
Tata[ry] = rx;
if (Rang[rx] == Rang[ry]) // daca arborii au aceeasi dimensiune, unim cei doi arbori apoi crestem dimensiunea noului arbore
Rang[rx]++;
}
}
}
int Radacina(int nod)
{
if (Tata[nod] == 0)
return nod;
else
{
int r = Radacina(Tata[nod]);
Tata[nod] = r;
return r;
}
}