Cod sursa(job #2279299)

Utilizator cameliapatileaPatilea Catalina Camelia cameliapatilea Data 9 noiembrie 2018 12:29:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
//#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;

}