Pagini recente » Cod sursa (job #2354509) | Cod sursa (job #2421194) | Istoria paginii runda/s-a_esuat/clasament | Istoria paginii runda/s-a_esuat/clasament | Cod sursa (job #2552516)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
vector <unsigned int> T, Rang;
unsigned int radacina(unsigned int x)
{
unsigned int R; // radacina
unsigned int y; // aux in care retin tatal precedent al lui x (inainte de a-l lega direct la radacina)
for (R = x; T[R] != R; R = T[R]); //acum R este radacina arborelui
//vreau sa plec de la x catre R, iar pe drum sa leg fiecare nod direct la radacina
while (T[x] != x)
{
y = T[x];
T[x] = R;
x = y;
}
return R;
}
void unire(unsigned int x, unsigned int y)
{
unsigned int rx = radacina(x), ry = radacina(y);
if (Rang[rx] > Rang[ry])
T[ry] = rx;
else
T[rx] = ry;
if (Rang[rx] == Rang[ry])
Rang[ry]++;
}
int main()
{
unsigned int n, m;
f >> n >> m;
T = Rang = vector <unsigned int> (n + 1, 0);
for (unsigned int i = 1; i <= n; i++)
{
T[i] = i;
Rang[i] = 1;
}
for (unsigned int i = 1; i <= m; i++)
{
unsigned int cod, x, y;
f >> cod >> x >> y;
if (cod == 1)
{
unire(x, y);
}
else
if (cod == 2)
{
if (radacina(x) != radacina(y))
g << "NU" << '\n';
else
g << "DA" << '\n';
}
}
return 0;
}