Pagini recente » Cod sursa (job #922489) | Cod sursa (job #842491) | Cod sursa (job #229621) | Cod sursa (job #1880604) | Cod sursa (job #2279288)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int vector_tati[100005], inaltime_arbore[100005];
int n , m;
int gaseste(int x)
{
int r, y;
r=x;
//stabilesc radacina in nodul x
//atata timp cat tatal radacinii este diferit de radacina
while(vector_tati[r] != r )
//radacina va fi inlocuita cu propriul sau tata
r = vector_tati[r];
//atata timp cat tatal lui x este diferit de x
while( vector_tati[x] != x)
{
//urc in arbore iar x va lua valoarea tatalui sau
//si urc tatal in arbore
y = vector_tati[x];
vector_tati[x] = r;
x = y;
}
//la final, returnez radacina arborelui din care face parte x
return r;
}
void uneste (int x, int y)
{
//in cazul in care inaltimea lui x e mai mare decat cea a lui y, il unesc pe y de x
if(inaltime_arbore[x] > inaltime_arbore[y])
vector_tati[y] = x;
else vector_tati[x] = y;
//daca cele 2 inaltimi sunt egale, atunci cresc inaltimea unuia dintre arbori
if(inaltime_arbore[x] == inaltime_arbore[y])
inaltime_arbore[y] ++;
}
int main() {
int n, m, x, y, cod;
f >> n >> m;
//initializez vectorul de tati cu valoare i
//initializez fiecare inaltime al fiecarui arbore cu valoarea 1
for( int i = 1; i <= n; i ++)
{
vector_tati [i] = i;
inaltime_arbore [i] = 1;
}
for(int i = 1; i <= m; i++)
{
f >> cod >> x >> y;
//daca interogarea mea este de tipul 1, atunci unesc cele doua noduri prin radacinile lor si creez o radacina comuna
if( cod == 1)
{
uneste( gaseste(x), gaseste(y));
}
//daca interogarea este de tipul 2, atunci daca radacina celor doua noduri este comuna
// afisez da, altfel afisez nu
else if( cod == 2)
{
if(gaseste(x) == gaseste(y) )
g <<"da"<<endl;
else g << "nu"<<endl;
}
}
return 0;
}