Pagini recente » Cod sursa (job #1292567) | Cod sursa (job #1952793) | Cod sursa (job #2145592) | Cod sursa (job #1656464) | Cod sursa (job #2943047)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n, m;
vector<int> tata(100001);
vector<int> h(100001);
// Gaseste parintele unui nod, facand in acelasi timp si compresia drumului.
int find_parent(int x)
{
//este radacina
if (tata[x] == 0)
{
return x;
}
//repetam cu tatal nodului pana ajungem la radacina
return tata[x] = find_parent(tata[x]);
}
int main()
{
f >> n >> m;
for(int i = 1; i <= n; i++) // initializare
{
//fieacare nod incepe ca fiind propriul sau parinte
tata[i] = 0;
h[i] = 0;
}
for (int i = 1; i <= m; i++)
{
int cod, x, y;
f >> cod >> x >> y;
if (cod == 1)
{
int rx = find_parent(x);
int ry = find_parent(y);
// daca arborele care il contine pe y e mai mic, atunci il atasam de arborele mai mare, anume cel care il contine pe x
if (h[rx] > h[ry])
{
// actualizam parintele arborelui y (cel mai mic) cu parintele arborelui lui x (cel mai mare)
tata[ry] = rx;
// //modificam rangul/inaltimea arborelui mai mare
// h[rx] += h[ry];
}
else
{
tata[rx] = ry;
// h[ry] += h[rx];
if(h[rx]==h[ry])
h[ry]=h[ry]+1;
}
}
else
{
int rx = find_parent(x);
int ry = find_parent(y);
if (rx == ry)
g << "DA\n";
else
g << "NU\n";
}
}
return 0;
}