Pagini recente » Cod sursa (job #2647271) | Cod sursa (job #2565352) | Cod sursa (job #2597456) | Cod sursa (job #1556114) | Cod sursa (job #2948147)
#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 f acelasi timp si compresia drumului.
int find_parent(int x)
{
//este radacina
if (tata[x] == 0)
{
return x;
}
//repetam pana ajungem la radacina
return tata[x] = find_parent(tata[x]);
}
int main()
{
f >> n >> m;
for(int i = 1; i <= n; i++) // initializare
{
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 nod2 e mai mic, atunci il atasam de arborele mai mare, anume cel care il contine pe nod1
// daca....
if (h[rx] > h[ry])
{
// actualizam parintele arborelui nod2 (cel mai mic) cu parintele arborelui lui nod1 (cel mai mare)
tata[ry] = rx;
//inaltimea nu se actualizeaza
}
else
{
tata[rx] = ry;
if(h[rx]==h[ry]) // f cazul f care au inaltimea egala
h[ry]=h[ry]+1; // actualizam inaltimea
}
}
else
{ // verificam daca nod1 si nod2 se afla f aceeasi multime
int rx = find_parent(x);
int ry = find_parent(y);
if (rx == ry)
g << "DA\n";
else
g << "NU\n";
}
}
return 0;
}