Pagini recente » Cod sursa (job #855001) | Cod sursa (job #1572682) | Cod sursa (job #1680292) | Cod sursa (job #2786214) | Cod sursa (job #2942033)
#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++)
{
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
{
parents[rx] = ry;
rang[ry] += rang[rx];
}
}
else
{
int rx = find_parent(x);
int ry = find_parent(y);
if (rx == ry) fout << "DA\n";
else fout << "NU\n";
}
}
return 0;
}