Pagini recente » Cod sursa (job #1195843) | Cod sursa (job #1390885) | Cod sursa (job #614968) | Cod sursa (job #2976795) | Cod sursa (job #2058140)
#include <fstream>
using namespace std;
const int NMAX = 100002;
int T[NMAX], RG[NMAX];
int N, M;
int find (int x)
{
int R, y;
//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
for (R = x; T[R] != R; R = T[R]);
//aplic compresia drumurilor
for (; T[x] != x;)
{
y = T[x];
T[x] = R;
x = y;
}
return R;
}
void unite (int x, int y)
{
//unesc multimea cu rang mai mic de cea cu rang mai mare
if (RG[x] > RG[y])
T[y] = x;
else T[x] = y;
//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
if (RG[x] == RG[y]) RG[y]++;
}
int main()
{
ifstream f ("disjoint.in");
ofstream g ("disjoint.out");
f >> N >> M;
int i, x, y, cd;
//initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
for (i = 1; i <= N; i++)
{
T[i] = i;
RG[i] = 1;
}
for (i = 1; i <= M; i++)
{
f >> cd >> x >> y;
if (cd == 2)
{
//verific daca radacina arborilor in care se afla x respectiv y este egala
if (find (x) == find (y) ) g << "DA\n";
else g << "NU\n";
}
else //unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
unite (find (x), find (y) );
}
return 0;
}