Pagini recente » Cod sursa (job #2751065) | Cod sursa (job #2252492) | Cod sursa (job #1573490) | Cod sursa (job #797299) | Cod sursa (job #2279299)
//#include <iostream>
//#include <fstream>
#include<stdio.h>
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
//radacina va fi inlocuita cu propriul sau tata
while(vector_tati[r] != r )
r = vector_tati[r];
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() {
FILE *f = fopen("disjoint.in", "r");
FILE *g = fopen("disjoint.out", "w");
int n, m, x, y, cod;
fscanf(f, "%d%d", &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++)
{
fscanf( f, "%d %d %d", &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) )
fprintf(g, "DA\n");
else fprintf(g, "NU\n");
}
}
return 0;
}