Pagini recente » Cod sursa (job #1693009) | Cod sursa (job #1547051) | Cod sursa (job #2160707) | Profil simona.poilinca | Cod sursa (job #2942031)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n, m;
vector<int> parents(100001);
vector<int> rang(100001);
// Gaseste parintele unui nod, facand in acelasi timp si compresia drumului.
int find_parent(int x)
{
//este radacina
if (parents[x] == x)
{
return x;
}
//repetam cu tatal nodului pana ajungem la radacina
return parents[x] = find_parent(parents[x]);
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
//fieacare nod incepe ca fiind propriul parinte
//parent[1] = 2 inseamna ca 2 e parintele lui 1
parents[i] = i;
rang[i] = 1;
}
for (int i = 1; i <= m; i++)
{
//citirea datelor
int cod, x, y;
fin >> cod >> x >> y;
//legam arborele mai mic de cel mai mare
if (cod == 1)
{
int rx = find_parent(x);
int ry = find_parent(y);
// daca arborele care l contine pe y e mai mic, atunci il atasam de arborele mai mare, anume ce l care l contine pe x
if (rang[rx] > rang[ry])
{
// actualizam parintele arborelui y (cel mai mic) cu parintele arborelui lui x (cel mai mare)
parents[ry] = rx;
//modificam rangul/inaltimea arborelui mai mare
rang[rx] += rang[ry];
}
else
{
// actualizam parintele arborelui x (cel mai mic) cu parintele arborelui lui y (cel mai mare)
parents[rx] = ry;
//modificam rangul/inaltimea arborelui mai mare
rang[ry] += rang[rx];
}
}
else
{
//gasim parintele/radacina pentru fiecare element
int rx = find_parent(x);
int ry = find_parent(y);
//daca au acelasi parinte inseamna ca fac parte din aceeasi multime/subset
if (rx == ry) fout << "DA"<<endl;
else fout << "NU"<<endl;
}
}
return 0;
}