Cod sursa(job #1850828)

Utilizator NarniussAnghelache Bogdan Narniuss Data 18 ianuarie 2017 22:41:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#define dim 100100

using namespace std;
int tata[dim],h[dim];

//returneaza radacina arborelui din care face parte x si face si compresarea drumurilor
int rad_arbore(int x)
{
  int i, rad, aux;
  rad = x;
  while(tata[rad] != rad){
    rad = tata[rad];
  }

  while(tata[x] != x){
    aux = x;
    tata[x] = rad;
    x = tata[aux];
  }

  return rad;
}

void reuniune(int x, int y)
{
  if(h[x] > h[y]){
    tata[y] = x;
  }else{
    tata[x] = y;
  }

  if(h[x] == h[y]) h[y]++;
}
int main()
{
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out");

    int cod, n, m, i ,x , y, j;
    fin>>n>>m;

    for(i = 1 ; i <= n ; i++){
      tata[i] = i;
      h[i] = 1;
    }

    for(i = 1 ; i <= m ; i++){
      fin>>cod>>x>>y;

      if(cod == 1){
        if (rad_arbore(x) == rad_arbore(y))  {fprintf(stderr,"%d ", i);return 0;}
        reuniune(rad_arbore(x), rad_arbore(y));
      }else{
        if(rad_arbore(x) == rad_arbore(y)){
          fout<<"DA\n";
        }
        else{
          fout<<"NU\n";
        }
      }
    }
    fin.close();
    fout.close();

    return 0;
}